我只是想知道,如果通過將複雜if else語句和生成的html標記移動到後面的代碼違反了某些「MVC」規則?將複雜的條件語句移到後面的代碼
這似乎是一個很好的選擇,當面對內聯if else語句時可能變得非常不可讀。
我只是想知道,如果通過將複雜if else語句和生成的html標記移動到後面的代碼違反了某些「MVC」規則?將複雜的條件語句移到後面的代碼
這似乎是一個很好的選擇,當面對內聯if else語句時可能變得非常不可讀。
我不喜歡在我的視圖中使用類背後的代碼。這不是因爲它默認違反了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中編寫所有醜陋的東西:)。
在您看來,有條件並不可怕。我會讓他們在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是的HtmlHelper的自定義擴展,需要我們自己的ICommand規範對象。呈現此視圖的控制器操作根據各種條件填充ViewData [「commands」]。換句話說,控制器進行控制。在這個動作的單元測試中,我們可以測試在各種條件下會出現正確的一組命令。
起初,這可能看起來像一個麻煩,相比之下,迅速投入一些IF的視圖。你必須問自己的問題是:「這個IF是否代表控制行爲,並且我想確保在某個時刻不會中斷?」