2010-06-24 104 views
5

任何人都可以詳細說明爲什麼要爲動態菜單等每個動作定義ViewData [「MenuData」]?ASP.NET MVC,部分視圖和數據

我有一個簡單的局部視圖呈現菜單,我從母版頁中呈現此菜單。這對於我從ASP.NET WebForms來說很直觀,但填充菜單的唯一方法是傳遞ViewData [「MenuData」],但是我必須在每個控制器操作中執行此操作。它確實感覺有點愚蠢,我不得不每次定義這個視圖數據。

就可測試性和ASP.NET MVC-ish而言,我應該如何處理這個問題?

回答

4

另一種選擇是使用RenderAction方法來代替這將調用一個動作(在當前控制器上,或者如果您提供了控制器名稱),然後可以爲您創建菜單數據,並調用您的ascx局部視圖:

因此,在我的母版頁我可以有:

<% Html.RenderAction("MenuArchiveList"); %> 

然後在我的控制器:

public ActionResult MenuArchiveList() { 
    return PartialView("BlogArchiveList", 
        _BlogRepository.GetArchiveYearPostCounts()); 
} 

這則成功地找到用戶控制\Views\Shared\BlogArchiveList.ascx

如果你想確保你的行動只會被調用的局部視圖的上下文,那麼你應該使用ChildActionOnlyAttribute來裝飾它。

這是從「futures」命名空間Microsoft.Web.Mvc的版本2中的System.Web.Mvc中添加的。

+0

這就是東西。謝謝。 – 2010-06-24 15:25:33

+0

沒問題,很高興。 – 2010-06-24 15:31:07

0

您應該使用基本控制器負責處理您的視圖模型的反覆人口,然後讓所有的控制器能從中得到

看到這裏ViewModel Best Practices