2010-08-17 21 views
1

試圖創建一個強大的多級導航的母版頁,並希望聽到您的意見。asp.net mvc導航的母版頁最佳實踐

我使用的MS這裏推薦樣本: http://www.asp.net/mvc/tutorials/passing-data-to-view-master-pages-vb

,所以我有一個獲得所有類別和所有其他控制器繼承它的ApplicationController中。並返回LIST並將其存儲在ViewData [「Nav」中]

母版頁作爲獲取NAV模型並創建菜單的分部視圖。 類別的roues 類別/ {CategoryId}/{CategoryName}/{Page}

問題是我如何顯示所選的類別或子類別作爲選擇時,我在partialView呈現它。

我看到一些選項: 1.創建在applicatin控制器中的另一個屬性:

public class CategoryController : AppliactionController 
{ 
    // 
    // GET: /Category/ 

    public ActionResult Index(string categoryId, string categoryName, int page) 
    { 
     base.ActiveCategoryId=int.parse(categoryId); 
     return View(); 
    } 
  • 創建菜單時檢查在局部視圖中的當前動作URL和設置類別爲選中,如果它產生相同的動作URL(不知道我是否可以從動作中獲得類別ID)
  • 有什麼建議嗎?

    回答

    0

    如果您打算使用主控制器模式,那麼選項1是一個合適的解決方案。爲了更好地分離,您可以考慮將動作中的邏輯移動到動作過濾器中。

    我會完全避免選項2,因爲您不希望在視圖中使用這種邏輯。

    您可以嘗試的第三個選項是不使用主控制器模式,而是設置您的視圖以調用RenderAction s,這些視圖與視圖的主要關注點正交。在這種情況下,您的視圖看起來像Html.RenderAction("Menu", Model.CurrentCategoryId)

    +0

    嗨, 感謝您的快速回復, 您可以指定更多關於邏輯移動到一個動作過濾器? (從WebForms遷移..) 再次感謝! – tomer 2010-08-17 19:34:38

    0

    關於您的細分: 「您可能會考慮將該操作中的邏輯移動到操作篩選器中。」

    我可以做到這一點,但有可能從操作過濾器訪問控制器案例控制器?

    它應該是這樣的

    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
        ((AppController)filterContext.Controller.base)).ActiveCategoryId=int.parse(filterContext.ActionParameters["CategoryId"]) 
    

    沒有檢查代碼,只是想聽聽你的想法,這是你的建議是什麼?

    感謝