2008-10-19 37 views
1

我只是想知道,如果通過將複雜if else語句和生成的html標記移動到後面的代碼違反了某些「MVC」規則?將複雜的條件語句移到後面的代碼

這似乎是一個很好的選擇,當面對內聯if else語句時可能變得非常不可讀。

回答

1

我不喜歡在我的視圖中使用類背後的代碼。這不是因爲它默認違反了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 
} 

也就是說,後面的代碼是視圖的一部分,所以你可以自由地使用它,如果它符合您的需求更好。

0

我相信只要它是一個渲染代碼,並且它在「視圖」而不是控制器中,那麼將它放在代碼後面或內聯就不重要了。只要確保你不在Controllers動作中編寫這段渲染代碼(這樣你就會違反MVC模式)。

0

代碼隱藏是視圖的一部分 - 如果您想直接在ASPX中或在代碼隱藏中放入東西,則由您決定。 MVC並不意味着你必須在ASPX中編寫所有醜陋的東西:)。

2

在您看來,有條件並不可怕。我會讓他們在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是否代表控制行爲,並且我想確保在某個時刻不會中斷?」