ViewModel最佳实践

 2023-02-17    436  

问题描述

从这个问题,它看起来有一个有意义的控制器创建一个 ViewModel ,更准确地反映视图正在尝试显示的模型,但我对一些约定(我是MVC模式的新的一些约定,如果不是已经明显).

基本上,我有以下问题:

ViewModel最佳实践

  1. 我通常喜欢有一个类/文件.如果仅创建从控制器向视图递送数据?
  2. ,则这是否有意义 ViewModel

  3. 如果 ViewModel 属于自己的文件,并且您正在使用目录/项目结构来保持分开的东西, ViewModel 文件属于哪个?在控制器目录中?

现在基本上是它.我可能有几个问题来了,但这一直困扰着我的最后一小时左右,我似乎可以在其他地方找到一致的指导.

编辑:
查看示例 nerddinner app 在Codeplex上,看起来ViewModel是控制器,但它仍然让我不舒服,他们不是自己的文件.

推荐答案

我创建了每个视图所谓的”ViewModel”.我将它们放在MVC Web项目中称为ViewModels的文件夹中.我在控制器和操作(或视图)后命名它们.因此,如果我需要将数据传递到成员资格控制器上的注册视图,我会创建empersepsignupViewModel.cs类并将其放在ViewModels文件夹中.

然后我添加必要的属性和方法,以便于将数据从控制器传输到视图.我使用automapper从我的视图中获取到域模型,并在必要时再次返回.

这也适用于包含其他视图类型类型的属性的复合视图模型.例如,如果您在成员资格控制器中的索引页上有5个小部件,并且您为每个部分视图创建了一个ViewModel – 您如何将数据从索引操作从索引操作传递给Partials?您将属性添加到MyPartialViewModel类型的MembershialIndexViewModel,并且在呈现部分时,您将通过Model.mypartialViewModel.

这样做允许您调整部分ViewModel属性,而无需更改索引视图.它仍然只是在Model.mypartialViewModel中传递,所以你的机会越来越少,你必须经过整个部分链子来解决一些你正在做的事情,以便在部分ViewModel中添加一个属性.

我还将将命名空间”myproject.web.viewmodels”添加到web.config,以便允许我在任何视图中引用它们,而不会在每个视图上添加一个显式导入语句.只是让它变得有点清洁.

其他推荐答案

按类别分隔类(控制器,视图,过滤器等)是废话.

如果要为您的网站的主页编写代码(/)然后创建一个名为home的文件夹,并在homeController,IndexViewModel,AboutViewModel等中填写所有相关类.

如果您有共享类,如applicationController,则可以将其放在项目的根目录中.

为什么单独的与之相关的东西(HomeController,IndexViewModel)并保持与所有关系的东西(HomeController,AccountController)?


我写了一个博客文章关于这个主题.

其他推荐答案

我将我的应用程序类保留在名为”核心”(或一个单独的类库)的子文件夹中,并使用与 kigg 样本应用,但有一些略微的变化,使我的应用程序更干燥.

我在/core/ViewData中创建一个BaseviewData类/我存储公共站点的范围内属性.

在此之后,我还在同一文件夹中创建我的所有视图viewData类,然后从BaseviewData派生并具有查看特定属性.

然后我创建一个ApplicationController,即所有控制器来自. ApplicationController具有通用GetViewData方法,如下所示:

protected T GetViewData<T>() where T : BaseViewData, new()
    {
        var viewData = new T
        {
           Property1 = "value1",
           Property2 = this.Method() // in the ApplicationController
        };
        return viewData;
    }

最后,在我的控制器操作中,我执行以下操作以构建我的ViewData模型

public ActionResult Index(int? id)
    {
        var viewData = this.GetViewData<PageViewData>();
        viewData.Page = this.DataContext.getPage(id); // ApplicationController
        ViewData.Model = viewData;
        return View();
    }

我认为这真的很好,它让您的观点整洁和您的控制器瘦.

以上所述是小编给大家介绍的ViewModel最佳实践,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/34183.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。