2010-08-17 48 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"]) 
    

    没有检查代码,只是想听听你的想法,这是你的建议是什么?

    感谢