【问题标题】:Viewmodel and dynamic menu best practices - ASP.NET MVCViewmodel 和动态菜单最佳实践 - ASP.NET MVC
【发布时间】:2011-03-23 19:22:17
【问题描述】:

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

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

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

如果我想在视图上显示的内容因布局而有所不同,我应该使用 2 个视图而不是一个吗?

有什么建议吗?

【问题讨论】:

    标签: asp.net-mvc viewmodel


    【解决方案1】:

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

    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 集合中的菜单。在您的过滤器中执行此操作。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-12
          • 2011-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-21
          • 2010-10-14
          相关资源
          最近更新 更多