Frage

Ich habe mich nur gefragt, wenn durch komplexe wenn sonst Aussagen zu bewegen und die resultierende HTML-Markup auf den Code hinter verletzt einige ‚MVC‘ Gesetz?

Es scheint wie eine gute Option, wenn es mit Inline wenn sonst Aussagen konfrontiert, die extrem unleserlich werden können.

War es hilfreich?

Lösung

Ich mag nicht den Code Behind-Klasse in meinen Ansichten verwenden. Dies ist nicht, weil es MVC standardmäßig verletzt, sondern weil ich, dass die „natürliche“ Art und Weise gefunden (zumindest für mich) ist anders.

Wenn ich komplexe HTML-Markup stellen, die rein bezieht sich Sorgen sehen, ich in der Regel eine Erweiterungsmethode für HtmlHelper Klasse schreiben, um die Komplexität zu verstecken. So habe ich Erweiterungen wie Html.MoneyTextBox(), Html.OptionGroup() und Html.Pager<T>.

In anderen Fällen, wenn komplexe Bedingungen entstehen, in der Regel habe ich etwas verpasst von der Steuerung. Zum Beispiel werden alle auf die Sichtbarkeit Fragen, nur lesbar oder von Elementen ermöglicht in der Regel von etwas eindämmen, die der Controller zur Verfügung stellen kann. In diesem Fall stattdessen das Modell der Ansicht vorbei, erstelle ich eine Ansicht Modell, das das Modell und die zusätzliche Informationen kapselt, dass der Controller, um die HTML-Markup zu vereinfachen bieten kann. Ein typisches Beispiel für View-Modell ist die folgende:

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
} 

Wie gesagt, hinter der Code Teil der Ansicht ist, so können Sie es frei verwenden, ob es Ihren Bedürfnissen besser entspricht.

Andere Tipps

Es ist nicht schrecklich conditionals aus Ihrer Sicht zu haben. Ich würde sie in der ASPX hält nicht den Code hinter. Jedoch ein bedingtes zeigt oft Regelverhalten. Betrachten Sie den folgenden ASPX Code:

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

Dieser Satz von conditionals repräsentiert Verhalten zu steuern, die von der Ansicht gehandhabt wird - das heißt, an der falschen Stelle. Dieses Verhalten ist nicht Einheit prüfbar. Betrachten wir statt:

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

In diesem Beispiel Action ist eine kundenspezifische Erweiterung von Htmlhelper, die unsere eigenen ICommand Spezifikation Aufgabe übernimmt. Der Controller-Aktion, die diese Ansicht rendert auffüllt Viewdata [ „Befehle“] auf der Grundlage verschiedener Bedingungen. Mit anderen Worten, der Controller die Steuerung. In den Unit-Tests für diese Aktion können wir unter verschiedenen Bedingungen der richtige Satz von Befehlen präsentiert wird.

testen, dass

Zunächst könnte dies wie ein Streit scheint im Vergleich zu schnell ein paar IFs in den Blick zu werfen. Die Frage, die Sie sich stellen sollten ist, „Ist diese IF repräsentieren Regelverhalten, und ich tut irgendwann Pause sicherstellen wollen, nicht wahr?“

Ich glaube, solange es sich um ein Rendering-Code und es ist in einer „Ansicht“ nicht in einem Controller, dann auf Code setzen hinter oder Inline keine Rolle. So stellen Sie sicher, dass Sie nicht schreiben, dieses Stück des Rendering-Code in den Controller-Aktionen (auf diese Weise werden Sie wirklich die MVC-Muster zu verletzen).

Der Code-Behind ist Teil der View - es ist an Sie, wenn Sie die Dinge in der ASPX direkt oder in dem Code-Behind setzen wollen. MVC bedeutet nicht, Sie haben die Dinge alle in der ASPX hässlich zu codieren.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top