2009-12-14 188 views
2

這更像是一個架構師問題,而不是需要代碼的問題。ASP.NET MVC - PartialView體系結構問題

我有一個頁面需要我顯示特定項目的狀態。爲了簡潔起見,有兩個州,即開放和封閉。

當項目打開時,我想顯示一個PartialView,向我顯示一組細節。如果項目已關閉,我想用不同的細節顯示PartialView。

現在我知道我可以在aspx中進行檢查並渲染一個或另一個,但我試圖減少aspx代碼中的決策點數量。我相信在aspx中應該有最少的實際代碼。

另外,還有兩種狀態,所以「if」語句會堆積並變得混亂。

有沒有人處理過這樣的事情?

我應該創建一個助手來做到這一點嗎?我可以,我不確定如何做到這一點,在視圖的ActionResult中處理這個問題?例如,我可以渲染動作結果中的部分視圖並將其作爲普通視圖的一部分返回嗎?

回答

7

你可以做邏輯控制器,並定義包含部分呈現的名稱ViewData的價值......所以在控制器,

if (Project.Status == "Open") { 
    ViewData["StatusPartial"] = "OpenPartial"; 
} else { 
    ViewData["StatusPartial"] = "ClosedPartial"; 
} 
在ASPX

然後就去做

<%=Html.RenderPartial(ViewData["StatusPartial"]) %> 
+0

+1。到目前爲止,我喜歡這個想法。謝謝。 – griegs 2009-12-14 00:38:38

+0

非常簡單,並保持它應該的邏輯。我喜歡。 – 2009-12-14 08:27:36

+0

這是迄今爲止最簡單的解決方案,但它有兩個缺陷: *「魔術串」(好吧,也許不是那麼神奇 - 但它們不是強類型的) *將項目狀態信息冗餘保存在兩個('ViewData [「StatusPartial」]'和模型對象的屬性) – 2009-12-14 10:21:18

5

如果代碼作爲Enum項目的狀態,您可以實際上只是得到正確的部分是沒有表現出任何條款,如果在任何時候,使用this neat trick

<% Html.RenderPartial(Enum.GetName(typeof(ProjStat), prj.Status) + 'Partial'); %> 

在上面的例子中,我假定Enum的名字是ProjStat,那你有你的局部視圖對應OpenPartial.ascxClosedPartial.ascx兩個狀態的命名約定值OpenClosed

+0

這是一個非常酷的解決方案!好主意! – 2009-12-14 01:23:06

+0

+1,是的,這實際上很整齊。 – griegs 2009-12-14 01:40:42

4

我喜歡@Chris Gutierrez的解決方案,但我會在您的ViewModel上使用一個屬性,而不是ViewData中的一個命名條目。你可能會結合起來,與控制器上的地圖,以節省一點代碼 - 示例假設Status.Open映射到0,Status.Closed映射到1

private readonly static string[] StatusViews 
    = new string[] { "OpenPartial", "ClosedPartial" }; 

... 
model.StatusView = StatusViews[(int)Project.Status]; 


<%= Html.RenderPartial(Model.StatusView) %> 
+0

+1。對,爲了使其可擴展,我可以從db或config中加載值。 – griegs 2009-12-14 03:24:06

+0

這是對克里斯解決方案的一個很好的修改 - 然而,這個視圖很可能已經呈現了關於這個項目的其他內容,並且將狀態既作爲「項目」實體的屬性也作爲單獨的特性看起來是多餘的在'ViewModel'上。 – 2009-12-14 10:18:10

+0

Grnated我只在MVC工作了一年多一點,但我所吸引的模式是每個視圖單獨的僅查看模式。這種視圖模型通常會爲業務模型包含一些額外的視圖項目,例如,在這種情況下,如果有選項,哪個部分可以選擇。我不確定我是怎麼處理這個問題的 - 我不願意在我的視圖中使用邏輯**和**選擇如何渲染某些東西似乎對我來說不是控制器的功能。可能我只是在視圖中使用基於模型屬性的if/then/else構造。 – tvanfosson 2009-12-14 12:43:14