2010-01-22 74 views
4

我越使用ASP.NET MVC,我越喜歡它。但是,在母版頁上顯示模型數據的情況下,似乎有幾種方法可以實現。我不確定最好的解決方案。ASP.NET MVC主頁數據

我的例子是一個商業網站,我希望在每個網頁上輸出產品類別列表,並顯示訪客購物車的狀態。

在asp.net web窗體中,我通常會使用用戶控件執行此操作,每個用戶控件都執行自己的數據綁定以檢索所需的數據。

在MVC中,所有數據都應該由控制器傳遞。

所以關於類最簡單的辦法似乎是通過這個在控制器動作視圖數據:

ViewData["Categories"] = _service.GetCategories(); 

但是,這樣做的每一個動作不是很乾所以以下this article我創建,增加了所需要的數據到我的ViewData鹼控制器:

public class AppController : Controller 
{ 
    IAppService _service; 

    public AppController() { } 
    public AppController(IAppService appService) 
    { 
     _service = appService; 
     SetSiteData(); 
    } 

    private void SetSiteData() 
    { 
     ViewData["Categories"] = _service.GetCategories(); 
    } 
} 

我然後創建了ViewMasterPage擴展:

 public static void RenderCategoryList(this ViewMasterPage pg) { 
     pg.Html.RenderPartial("CategoryList", pg.ViewData["Categories"]); 
    } 

在我的母版:

 <div> 
     <%this.RenderCategoryList(); %> 
    </div> 

這似乎是一個相當乾淨的方法。但是,這是最好的方式,因爲我也看到了爲您的MasterPage創建ViewModel的建議。我可以看到,也許隨着ViewModel數據的增長,這可能是一個更好的解決方案。

關於購物車狀態,我想我會做類似的事情,但我不確定RenderAction是否更合適(When to use RenderAction vs RenderPartial with ASP.NET MVC)。 謝謝, 本

回答

7

這樣的作品,雖然它不是我會做有兩個原因方式:

  1. 我不喜歡粘數據到ViewState的,因爲你基本上是強制轉換爲對象
  2. 通過要求基本控制器你限制功能,從這個basecontroller繼承控制器(這可能不是一個雖然問題)

我認爲這將是一個完美的使用RenderAction(MvcFutures項目的一部分)。這個幫助器可以用來在另一個控制器上渲染一個Action。所以,你可能有一個ListCategories行動ProductController的,你可能只是這樣做:

<% Html.RenderAction<ProductController>(x => x.ListCategories()); %> 

ListCategories會打電話

_service.GetCategories(); 

,並可能粘在信息變成自己的模型。然後它會將該模型傳遞給View將是一個Partial Page。

+1

對於RenderAction來說,它幾乎是一個完美的解決方案,在MVC2發佈之後,您可以緩存RenderAction結果,這將是完美的。 – mxmissile 2010-01-22 15:37:01

+0

我是否需要做任何事情來使用上面使用的強類型RenderAction調用?我正在使用mvc 2.0預覽,並且似乎無法以這種方式構建RenderAction方法。 – 2010-01-23 09:35:43

2

謝謝 - RenderAction是完美的工作。

我從here瞭解到更多信息。

所以對於其他人的利益,在這裏是如何,我輸出車狀態的例子:

操作:

[ChildActionOnly] 
    public ActionResult CartStatus() 
    { 
     return PartialView(_service.GetCartSummary()); 
    } 

局部視圖(綁定到Models.Cart)

<div class="cartSummary"> 
<%if (Model.HasItems) { %> 
    Cart Items: <%=Model.Items.Count() %> | Total: <%=Model.TotalItems %> 
<%} else {%> 
    Your cart is empty. Please buy stuff! 
<%} %> 

母版頁的輔助方法:

public static void RenderCartStatus(this ViewMasterPage pg) { 
     pg.Html.RenderAction("CartStatus", "Catalog", null); 
    } 

最後母版頁:

<%this.RenderCartStatus(); %> 

謝謝你的建議。

+0

試圖實現這個解決方案,但我不知道我們在哪裏創建輔助方法的母版頁?我是否在某處創建另一個c#類文件? – JBeckton 2010-10-11 02:33:45

+0

@JBeckon - 是的,你可以創建一個靜態類來包含這些擴展。只要確保在視圖或web.config中引用命名空間。 – 2010-10-11 16:20:58