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

时间:2011-03-23 19:22:18

标签: asp.net-mvc viewmodel

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

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

我想知道这是不是一个好习惯。是否应该使用2个视图(每个布局一个)并使用部分视图作为公共部分?

如果根据布局我希望在视图上显示的内容存在一些差异,我应该使用2个视图而不是一个吗?

任何推荐?

3 个答案:

答案 0 :(得分:7)

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

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

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

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

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

答案 1 :(得分:2)

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

如果你最终使用基本模型,here是另一个有很好例子的答案。

答案 2 :(得分:0)

我认为使用if / else逻辑使用两个视图与单个视图归结为代码重用。如果两个菜单完全不同,那么我建议创建两个视图。如果菜单大致相同,除了一些菜单项,那么我只使用一个带有一些if / else逻辑的视图。