質問

複雑なif elseステートメントと結果のhtmlマークアップを背後のコードに移動することで、「MVC」の法律に違反するのではないかと思ったのですが、

インラインif elseステートメントが非常に読みにくくなる可能性がある場合、これは素晴らしいオプションのようです。

役に立ちましたか?

解決

ビューでクラスの背後にあるコードを使用しないことを好みます。これは、デフォルトでMVCに違反しているからではなく、<!> quot; natural <!> quot;方法(少なくとも私にとって)は異なります。

ビューの純粋な懸念に関連する複雑なHTMLマークアップに直面するとき、通常、複雑さを隠すためにHtmlHelperクラスの拡張メソッドを記述します。したがって、Html.MoneyTextBox()Html.OptionGroup()、およびHtml.Pager<T>のような拡張子があります。

複雑な条件が発生する他のケースでは、通常、コントローラーから何かを見逃しました。たとえば、要素の可視性、読み取り専用、または有効化に関連するすべての問題は、通常、コントローラーが提供できるものに起因します。その場合、モデルをビューに渡す代わりに、HTMLマークアップを簡素化するためにモデルとコントローラーが提供できる追加情報をカプセル化するビューモデルを作成します。ビューモデルの典型的な例は次のとおりです。

public class CustomerInfo
{
  public Customer Customer { get; set; }
  public bool IsEditable { get; set; }  // e.g. based on current user/role
  public bool NeedFullAddress { get; set; }  // e.g. based on requested action 
  public bool IsEligibleForSomething { get; set; }  // e.g. based on business rule
} 

とはいえ、コードビハインドはビューの一部であるため、ニーズに合っている場合は自由に使用できます。

他のヒント

ビューに条件を設定するのは恐ろしいことではありません。コードビハインドではなくASPXに保存します。ただし、条件は多くの場合、制御動作を示します。次のASPXコードを検討してください。

<%if (ViewData["something"] == "foo") {%>
     <%=Html.ActionLink("Save", "Save") %> 
<%}%>
<%if (ViewData["somethingElse"] == "bar") {%>
     <%=Html.ActionLink("Delete", "Delete") %> 
<%}%>

この一連の条件は、ビューによって処理されている制御動作を表します(つまり、間違った場所で)。この動作はユニットテストできません。代わりに考慮してください:

<%foreach (var command in (IList<ICommand>)ViewData["commands"]) {%>
     <%=Html.ActionLink(command) %>
<%}%>

この例のActionLinkは、独自のICommand仕様オブジェクトを取得するHtmlHelperのカスタム拡張です。このビューをレンダリングするコントローラーアクションは、さまざまな条件に基づいてViewData [<!> quot; commands <!> quot;]を生成します。つまり、コントローラーが制御を行います。このアクションの単体テストでは、さまざまな条件下で正しいコマンドセットが表示されることをテストできます。

最初は、いくつかのIFをビューにすばやく投げるのに比べて、これは面倒に思えるかもしれません。自問しなければならない質問は、<!> quot;このIFは制御動作を表しているのか、ある時点で中断しないようにしたいのか?<!> quot;

レンダリングコードであり、<!> quot; View <!> quot;内にある限り、私は信じます。コントローラーではなく、コードビハインドやインラインに配置することは重要ではありません。 Controllersアクションでこのレンダリングコードの一部を書かないようにしてください(このようにすると、MVCパターンに違反することになります)。

コードビハインドはビューの一部です。ASPXに直接配置するか、コードビハインドに配置するかはユーザー次第です。 MVCは、ASPXですべての見苦しいことをコーディングする必要があるという意味ではありません:)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top