Asp.net mvc Viewmodel和动态菜单最佳实践-ASP.NET MVC

Asp.net mvc Viewmodel和动态菜单最佳实践-ASP.NET MVC,asp.net-mvc,viewmodel,Asp.net Mvc,Viewmodel,我在asp.net MVC中创建了一个新网站,它的动态菜单会根据用户的不同而变化。但这还不是全部。根据用户的不同,我使用了两种不同的布局(Razor布局),两种不同的布局具有不同的菜单。所以我有两个不同的布局和两个不同的动态菜单 我想对两个布局使用相同的视图,每个视图使用一个viewmodel。我使用动作过滤器来确定布局。设计一个包含数据的“ViewModel”基类来显示两个菜单(即使每次只创建一个菜单)并为我的所有ViewModel(每个视图一个ViewModel)创建该基类的子类,这是一个好

我在asp.net MVC中创建了一个新网站,它的动态菜单会根据用户的不同而变化。但这还不是全部。根据用户的不同,我使用了两种不同的布局(Razor布局),两种不同的布局具有不同的菜单。所以我有两个不同的布局和两个不同的动态菜单

我想对两个布局使用相同的视图,每个视图使用一个viewmodel。我使用动作过滤器来确定布局。设计一个包含数据的“ViewModel”基类来显示两个菜单(即使每次只创建一个菜单)并为我的所有ViewModel(每个视图一个ViewModel)创建该基类的子类,这是一个好主意吗

我想知道这是否是一个好的做法。在这种情况下,我是否应该使用2个视图(每个布局一个)并对公共零件使用局部视图

如果我想在视图上显示的内容与布局不同,我应该使用两个视图而不是一个视图吗


有什么建议吗?

在我看来,最好的做法是为您的视图创建一个视图模型,其上的属性包含一些确定动态菜单形成方式的对象。例如:

public class MyViewModel
{
     public int SomeData { get; set; } // basic Stuff
     public IDynamicMenuData MenuData { get; set; }
}
根据要为该用户渲染的菜单,将动态菜单数据的实现指定给视图模型。然后,在您的视图中,您可以调用:

@Html.DisplayFor(x => x.MenuData)

您想要动态菜单的位置。然后,您可以为每种类型的IDynamiceNuData实现创建一个显示模板,它将相应地呈现。然后,您只需要一个视图,一个视图模型,就可以有X个动态菜单的实现。

我认为使用两个视图与使用if/else逻辑的单个视图相比,归结为代码重用。如果这两个菜单差别很大,那么我建议创建两个视图。如果菜单除了几个菜单项外基本相同,那么我将只使用带有一些If/else逻辑的单个视图。

我强烈建议不要使用包含菜单属性的基本视图模型,因为它非常严格。(例如,如果使用局部视图会发生什么情况?如果要将模型序列化为JSON for AJAX会发生什么情况?如果忘记从基础继承,会不会发生问题?)相反,我建议为菜单创建一个单独的视图模型,该模型可以存储在ViewData集合中。在过滤器中执行此操作

如果您最终使用的是基础模型,那么另一个答案就是一个很好的例子