複雑なif elseステートメントと結果のhtmlマークアップをコードビハインドに移動することで、「MVC」法に違反するのではないかと思っていましたか?
非常に読みにくくなる可能性があるインライン if else ステートメントに直面した場合、これは優れたオプションのように思えます。
複雑なif elseステートメントと結果のhtmlマークアップをコードビハインドに移動することで、「MVC」法に違反するのではないかと思っていましたか?
非常に読みにくくなる可能性があるインライン if else ステートメントに直面した場合、これは優れたオプションのように思えます。
ビューに条件を含めることは恐ろしいことではありません。コードビハインドではなく、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["commands"] を設定します。つまり、コントローラーが制御を行います。このアクションの単体テストでは、さまざまな条件下で正しいコマンド セットが表示されることをテストできます。
最初は、いくつかの IF をすばやくビューに投入するのに比べて面倒に思えるかもしれません。自問しなければならない質問は、「この IF は制御動作を表しているか、ある時点で中断しないようにしたいのか?」ということです。
私の見解では、クラスの背後にあるコードを使用したくない。これは、デフォルトでMVCに違反しているためではなく、「自然な」方法(少なくとも私にとっては)が異なることがわかったためです。
純粋にビューの懸念に関連する複雑な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
}
とはいえ、背後にあるコードはビューの一部であるため、ニーズに合っていれば、自由に使用できます。
レンダリングコードであり、コントローラーではなく「ビュー」にある限り、コードビハインドやインラインに配置することは重要ではないと思います。Controllersアクションでレンダリングコードのこの部分を記述しないように注意してください(この方法では、MVCパターンに実際に違反します)。
コード ビハインドはビューの一部です。何かを ASPX に直接配置するか、コード ビハインドに配置するかはあなた次第です。MVCは、ASPXで醜いものをすべてコーディングする必要があるという意味ではありません:)。