如何避免每个模型都需要一个 VIewModel

2023-12-08

我正在使用 ASP.NET 4 和 MVC3。

通常,我发现我需要一个 ViewModel 来显示我的模型的信息。例如,采用以下模型

class Profile
{
   public int UserID { get; set; }
   public string Name { get; set; }
   public DateTime DOB { get; set; }
}

需要隐藏 UserID,但要显示 UserName,所以通常对于与上面类似的模型,我必须想出一个 ViewModel,只需将 UserID 更改为 UserName:

class ProfileViewModel
{
   public string UserName { get; set; }
   public string Name { get; set; }
   public DateTime DOB { get; set; }
}

有什么办法吗?


直到最近,我总是将模型传递给操作方法,因为我还认为使用相同的属性名称创建 viewModel 是重复的(事实并非如此)。这给我造成了lot的痛苦。我现在已经接受了重新教育,并且几乎总是在我的操作方法中专门使用 viewModels(当然总会有一些情况可以将模型直接传递给操作方法)。

读一读this这篇文章让我开始使用 viewModels。这将告诉您以下信息:

  1. 模型和视图模型之间的区别
  2. 何时应分别使用。
  3. 如何避免默认模型绑定程序的一些安全问题。

除了链接帖子中的信息之外,您还应该考虑诸如验证之类的事情。我有一个模型实现了IValidateableObject接口以确保实体在保存到数据库之前处于有效状态。

在我的 ASP.NET 应用程序中,我想创建一个多步骤表单,允许用户在多个页面上输入信息。我在这里遇到的问题是 ASP.NET 也使用IValidatableObject模型绑定过程中的接口。

如果您只允许用户输入实体所需信息的子集,则模型绑定器将只能填写给定的信息。根据您的验证的复杂程度,这可能会导致ModelState被标记为无效entire实体无效。

我解决这个问题的方法是使用一个 viewModel 来表示每个步骤,每个步骤都有自己的验证。这样您只需在每个步骤验证属性。一旦到达最后一步并且一切都有效,我就会使用用户提供的信息创建一个适当的实体。该实体将仅对其执行数据库级验证检查(字段长度等)

我的建议不是避免使用 viewModel,而是理解为什么使用它们并拥抱它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何避免每个模型都需要一个 VIewModel 的相关文章

  • ASPNET MVC - 使用具有相同签名的新助手覆盖 Html.TextBoxFor(model.property)?

    我想用我自己的助手重写 Html TextBoxFor 该助手具有完全相同的签名 当然 但名称空间不同 这是否可能 如果可以 如何实现 原因是我在现有的应用程序中有 100 多个视图 并且我想更改 TextBoxFor 的行为 以便在属性具
  • .net MVC、SelectList 和 LINQ

    我刚开始在 MVC 框架中使用 Html DropDownList 并且很难理解如何从数据库中选择数据以绑定到 DropDownList 有没有一种简单的方法可以从标准 LINQ 查询返回可绑定列表 例如 SelectList Select
  • 安装 ASP.NET MVC 的修改版本

    我对 MVC 1 0 源代码进行了相对简单的更改 以纠正 DropDownList HtmlHelper 中的错误 在另一个问题中讨论过 https stackoverflow com questions 1614923 persistin
  • 使用 R.Net 版本 1.5.5 创建 REngine 实例

    我正在尝试创建一个 Hello World 示例R Language using R Net版本1 5 5 从 NuGet 加载 不幸的是 我见过的在线示例都不起作用 这就是我所做的 已安装Microsoft R Open 3 2 4 增强
  • 无效操作。连接已关闭。 ASP.NET MVC

    这种情况并不经常发生 但有时我会收到一封通过电子邮件发送给我的异常报告 指出这段代码 我想知道您是否发现以下代码有任何问题 我无法让它在本地失败 并且使用断点跟踪数据总是会一步步给出正确的结果 namespace DomainModel C
  • UIHint 不使用 EditorTemplate

    我有一个这样的模型 public class MyModel ScaffoldColumn false public int CharityId get set UIHint Charities public SelectList Char
  • MVC 5 动态行与 BeginCollectionItem

    单击按钮时向表添加 删除行的最佳方法是什么 我需要从子类属性创建的行 子类是主类 模型中的列表 当前有一个视图 模型是 MyMain 它使用 RenderPartial 引用部分视图 分部视图显示模型的属性 一个名为 MyChild 的类
  • Asp.Net 捆绑不使用 .min 文件

    根据发布模式下的文档 捆绑程序应该使用 min js 文件 如果存在 我通过以下方式添加角度 bundles Add new ScriptBundle Bundles Scripts Include Content Scripts angu
  • ASP.NET Core/MVC 6 ViewModel 中的依赖注入 (DI)

    我使用构造函数注入在控制器中成功使用了 ASP NET 5 MVC 6 DI 我现在有一个场景 我希望我的视图模型在实现 IValidatableObject 时在 Validate 方法中使用服务 ViewModel 中的构造函数注入不起
  • ASP.Net MVC 4 通用主要难点

    我正在开发一个ASP NET MVC 4Web应用程序 以前我的 MVC 应用程序是使用MVC 3和这个新的MVC 4我刚刚复制 重复使用了我的应用程序认证和授权码从以前的应用程序 当用户登录我的网站时 我会执行以下操作 账户控制器 pub
  • 用户注销速度非常快

    我正在使用 ASP NET 身份成员身份 这是 Startup Auth cs 代码 app CreatePerOwinContext EFDbContext Create app CreatePerOwinContext
  • 具有 ASP.NET Identity 的 MVC 5 - 用户登录时获取声明

    我正在使用 OWIN 2 0 在登录用户后 我想从数据库中检索现有的声明 但如果我尝试获取用户的声明 它们将为空 如果我将相同的代码放入任何被调用的后续控制器中 那么声明就在那里 似乎只有在首次登录后的下一个请求之前 这些声明才可用 为什么
  • C# SMTP 身份验证失败,但凭据正确

    这是我的问题 我编写了以下程序来测试是否可以发送电子邮件 class Program static void Main string args try Console WriteLine Mail To MailAddress to new
  • 如何根据 ASP.NET VNEXT MVC6 中给出的路径进行虚拟路由/重定向?

    我有一个网站 它在不同的路径上公开多个 API 每个 API 由特定于应用程序部分的控制器处理 例如example com Api Controller Action param1 stuff 其中控制器发生变化 但操作保持相当一致 我有几
  • PostAsync 方法的 HttpClient 错误

    使用 HttpClient 对第 3 方 API 进行 PostAsync 调用时 当我执行 client PostAsync 时 我正好看到此错误 知道是什么原因造成的吗 Code public class JobController A
  • 将多个对象传递给我的控制器

    我将一个对象传递给我的控制器 如下所示 var form JSON stringify subRevisedRequest frmRevised val subSubcontractor frmSubcontractor val subDe
  • 使用实体框架重叠约会

    我将 asp net mvc 与实体框架一起使用 我有一个包含 startat 字段 endat 字段和 roomid 字段 称为 SpaceConfigurationId 的约会列表 并且希望查找给定房间已重复预订的约会列表 可以假设 e
  • (VS2017)运行所选代码生成器时出错:“序列不包含元素”

    我正在跑过微软的教程之一 https learn microsoft com en us aspnet core tutorials first mvc app 关于 MVC 开发 我在尝试创建各种元素时遇到错误 视图 控制器等 我收到的错
  • 如何强制 Visual Studio 2008 生成 Designer.cs,例如不管怎样.aspx.designer.cs

    我在使用 Visual Studio 2005 使用网站技术生成的 Asp Net V2 0 中有一些 Web 表单 想要将它们导入到设置为 v3 5 Asp Net MVC 的 Visual Studio 2008 我在其中使用项目技术
  • 良好的 WiX 编辑器 [重复]

    这个问题在这里已经有答案了 我目前正在开发一个使用 WiX 创建 MSI 的项目 我过去在 Sourceforge 上使用 WiXEdit 来管理包含在 WiX 项目中的文件 因为它比直接操作 XML 稍微容易一些 但它仍然有点笨重 有谁知

随机推荐