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

发布于 2024-10-25 10:01:21 字数 395 浏览 1 评论 0原文

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

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

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

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

有什么建议吗?

I'm starting a new website in asp.net MVC with a dynamic menu that change depending on the user. But that's not all. I use 2 different layouts (Razor layouts) depending on the user and the 2 differents layouts have a different menu. So I have 2 different Layouts with 2 different dynamics menus.

I would like to use the same view for the 2 layouts with one viewmodel per view. I use an action filter to determine the layout. Is it a good idea to design a "ViewModel" base class that contain the data to display both menus (even if just one menu is created every time) and create child of this base class for all my viewmodel (one viewmodel per view).

I want to know if it's a good practice. Is it a case where I should use 2 view (one per layout) and use partial views for the common part ?

And if there is some differences on what I want to display on the view depending of the layout, should I use 2 Views instead of one ?

Any recommandations ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

平定天下 2024-11-01 10:01:21

在我看来,最佳实践是为您的视图提供一个视图模型,其属性包含一些确定动态菜单如何形成的对象。示例:

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

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

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

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

In my opinion, the best practice would be to have one view model for your view, with a property on it containing some object that determines how your dynamic menu is formed. Example:

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

You assign an implementation of dynamic menu data to your view model based on which menu you want to render for that user. Then, in your view you can invoke:

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

Where you want your dynamic menu. You can then create a display template for each type of IDynamicMenuData implementation, and it will render accordingly. Then, you only need one view, one view model and you can have X number of implementations of your dynamic menu.

蓝眼睛不忧郁 2024-11-01 10:01:21

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

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

I would strongly recommend against using a base view model with menu properties in it because it is very rigid. (What happens if you use partial views, for instance? What if you want to serialize a model to JSON for AJAX? Will things blow up if you forget to inherit from the base?) Instead, I recommend creating a separate view model for your menu which can be stored in the ViewData collection. Do this in your filter.

If you do end up using a base model, here is another answer that has a good example.

机场等船 2024-11-01 10:01:21

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

I think using two views vs. a single view with if/else logic comes down to code reuse. If the two menus are wildly different then I would suggest creating two views. If the menus are mostly the same except for for a few menu items then I would just use a single view with some if/else logic.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文