2010-05-26 63 views
5

我發現自己在我的視圖中編寫了很多類似下面代碼的代碼。在這種情況下,我想爲新手添加一些解釋性HTML,併爲專家用戶添加不同的HTML。MVC視圖中的分支邏輯

<% if (ViewData["novice"] != null) { %> 
some extra HTML for a novice 
<% } else { %> 
some HTML for an expert 
<% } %> 

這是表示邏輯,所以它是有道理的,它是在一個視圖與控制器。然而,它變得非常難看,特別是當ReSharper想要移動所有大括號以使其變得更醜陋時(有沒有辦法關閉視圖?)。

我的問題是,這是否是正確的,或者我應該在控制器轉移到兩個不同的看法?如果我做了兩個視圖,我會有很多重複的HTML來維護。

或者我應該做的是共同的東西共享局部視圖兩個獨立的看法?

回答

2

理想情況下,這種邏輯將在視圖模型中處理,視圖應該只是渲染模型。

所以,你可能有這樣的事情在你看來:

<%= ViewData["helptext"] %> 

和你的控制器邏輯是這樣的:

ViewData["helpText"] = isNovice ? noviceText : expertText; 

這樣你可以把這個邏輯回控制器並保持你的意見非常乾淨

+0

我可以看到這個優點,但是如果文本是複雜的HTML標記,比如圖片和內容呢?現在你的控制器裏有HTML。 另外,感謝您修復我的代碼示例 – 2010-05-26 01:53:43

+0

Nice lomax好得多。我喜歡。 +1 – 2010-05-26 01:58:43

+0

這取決於複雜文本的情況以及需要多少更改,但我不明白爲什麼不能使用同一方法呈現可變部分? – lomaxx 2010-05-26 23:37:16

1

您正在嘗試使用相同的模型創建2個完全獨立的html頁面。你想要一個單獨的視圖。不要試圖用條件分支邏輯來巧妙地設計模式。

HTML傭工不會幫助你在這裏多,因爲它似乎你不會被重複比的if else其他很多邏輯。

+0

我只能說我即使有重複的邏輯我寧願用,而不是重複代碼幫手了。代碼的重複只會導致維護頭痛,應該皺起了眉頭 – 2010-05-26 01:45:59

+0

我不認爲你想要一個單獨的視圖,因爲它會造成額外的維護開銷。我更傾向於將邏輯推回到控制器並擁有單一的清晰視圖 – lomaxx 2010-05-26 01:49:37

+0

您可以將重複代碼放入partials中,但大圖似乎需要兩個單獨的視圖,即「專家用戶的不同HTML」重複代碼不好,針對設計模式的工作更差。 – 2010-05-26 01:53:50