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

4
我正在使用asp.net MVC创建一个新网站,其中包含一个根据用户更改的动态菜单。但这还不是全部。我使用2种不同的布局(Razor布局)取决于用户,而且这2种不同的布局有不同的菜单。所以我有两个不同的布局和两个不同的动态菜单。
我想使用相同的视图用于两个布局,每个视图都有一个视图模型。我使用一个操作过滤器来确定布局。设计一个“ViewModel”基类是否是一个好主意,该基类包含显示两个菜单的数据(即使每次只创建一个菜单),并为所有视图模型创建此基类的子类(每个视图一个视图模型)。
我想知道这是否是一个好的实践。如果在视图上要显示的内容取决于布局是否有差异,那么我应该使用2个视图而不是1个吗?
有什么建议吗?
3个回答

7

在我看来,最佳实践是为您的视图创建一个视图模型,并在其中包含一个属性,该属性包含某个对象,该对象确定如何形成您的动态菜单。例如:

public class MyViewModel
{
     public int SomeData { get; set; } // basic Stuff
     public IDynamicMenuData MenuData { get; set; }
}

根据您想要为该用户呈现的菜单,将动态菜单数据的实现分配给您的视图模型。然后,在您的视图中,您可以调用:

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

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


2
我强烈建议不要使用带有菜单属性的基本视图模型,因为它非常死板。(例如,如果您使用部分视图怎么办?如果您想将模型序列化为JSON以进行AJAX,则会发生什么?如果您忘记从基类继承,会发生什么爆炸?)相反,我建议为菜单创建一个单独的视图模型,可以存储在ViewData集合中。在您的过滤器中执行此操作。
如果您最终使用基础模型,这里是另一个答案,其中有一个很好的示例。

0

我认为使用两个视图与使用带有if/else逻辑的单个视图归结于代码重用。如果这两个菜单非常不同,那么我建议创建两个视图。如果这些菜单除了一些菜单项外基本相同,那么我会使用带有一些if/else逻辑的单个视图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接