Asp.net mvc 使用强类型视图的上下文相关ASP.NET MVC导航菜单?

Asp.net mvc 使用强类型视图的上下文相关ASP.NET MVC导航菜单?,asp.net-mvc,Asp.net Mvc,我正在尝试找出在ASP.NET MVC中创建导航菜单的最佳方法,该菜单可以根据构建它的控制器操作进行更改(根据用户权限等也会有所不同)。导航菜单显示在母版页中,我们所有的视图都是强类型的 我想在基本控制器中使用OnActionExecuting来填充标准菜单,然后在每个控制器操作中相应地修改它。但这似乎不是一个选项,因为视图模型在调用my action之前不可用 我唯一能想到的另一件事是在基本ViewModel构造函数中预填充菜单对象。然后,我可以根据需要在控制器操作中添加/删除。但这似乎并不完

我正在尝试找出在ASP.NET MVC中创建导航菜单的最佳方法,该菜单可以根据构建它的控制器操作进行更改(根据用户权限等也会有所不同)。导航菜单显示在母版页中,我们所有的视图都是强类型的

我想在基本控制器中使用OnActionExecuting来填充标准菜单,然后在每个控制器操作中相应地修改它。但这似乎不是一个选项,因为视图模型在调用my action之前不可用

我唯一能想到的另一件事是在基本ViewModel构造函数中预填充菜单对象。然后,我可以根据需要在控制器操作中添加/删除。但这似乎并不完全合适,因为我将在ViewModel构造函数中实例化返回控制器操作的链接(因为每个菜单项都可以有一个控制器/操作/id)


有没有关于最好的方法的建议?尤其是导航菜单(或者可能是TreeView),它们会根据上下文发生显著变化。

中似乎是解决您问题的合适方法。

中似乎是解决您问题的合适方法。

我使用MasterModel来解决这类问题

在我看来,.aspx及其.master是可分离的(例如,在渲染aspx时可以交换master;此外,aspx不从master继承,它只使用master),因此视图模型也应该是分离的。(即PageModel不应从MasterModel继承。)

aspx可能只关心接收(比如)IEnumerable,为什么它的视图模型需要从某个公共类继承

因此,不是:

public class MasterModel
{
    public string Title { get; set; }
    public MenuModel Menu { get; set; }
}

public class PageViewModel
    : MasterModel
{
    public IEnumerable<Foo> TheOnlyThingInTheWorldMyPageReallyCaresAbout { get; set; }
}

public ActionResult TheAction()
{
    var items = GetItems();
    var model = new PageViewModel {
        TheOnlyThingInTheWorldMyPageReallyCaresAbout = items
    };
    return view("Viewname", model);
}
然后,您可以将其添加到母版页:

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>

<script runat="server">
    public MasterModel Model { get { return ViewData["MasterModel"] as MasterModel; } }
</script>

虽然没有给出一个具体的解决方案,但这是否为您提供了重构代码以使其味道更好的选项?

我使用MasterModel来处理这类问题

在我看来,.aspx及其.master是可分离的(例如,在渲染aspx时可以交换master;此外,aspx不从master继承,它只使用master),因此视图模型也应该是分离的。(即PageModel不应从MasterModel继承。)

aspx可能只关心接收(比如)IEnumerable,为什么它的视图模型需要从某个公共类继承

因此,不是:

public class MasterModel
{
    public string Title { get; set; }
    public MenuModel Menu { get; set; }
}

public class PageViewModel
    : MasterModel
{
    public IEnumerable<Foo> TheOnlyThingInTheWorldMyPageReallyCaresAbout { get; set; }
}

public ActionResult TheAction()
{
    var items = GetItems();
    var model = new PageViewModel {
        TheOnlyThingInTheWorldMyPageReallyCaresAbout = items
    };
    return view("Viewname", model);
}
然后,您可以将其添加到母版页:

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>

<script runat="server">
    public MasterModel Model { get { return ViewData["MasterModel"] as MasterModel; } }
</script>

虽然没有给出一个具体的解决方案,但这是否为您提供了重构代码以使其味道更好的选项?

我考虑过这一点,但我希望使用现有框架实现菜单。。。还有一些没有打破MVC模式的东西。这看起来应该很容易。。。我觉得我只是错过了一些明显的东西。我想过,但我希望使用现有的框架实现菜单。。。还有一些没有打破MVC模式的东西。这看起来应该很容易。。。我觉得我遗漏了一些明显的东西。我们最终只是创建了一个包含这些数据的基本viewmodel类,所以在某种意义上它类似于您的mastermodel想法。我们最终只是创建了一个包含这些数据的基本viewmodel类,所以在某种意义上它类似于您的mastermodel想法。