嵌套 ViewModel 的验证

2024-01-04

我有两个 ViewModel(简化):

public class ParentViewModel
{
    public ParentViewModel
    {
        Content = new ChildViewModel();
    }

    public ChildViewModel Content { get; set, }
}

public class ChildViewModel
{
    [Required]
    public string Name1 { get; set, }
    [Required]
    public string Name2 { get; set, }
}

以及以下控制器后操作:

[HttpPost]
public ActionResult Create(ParentViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        // process viewModel -> write something into database
        return RedirectToAction("Index");
    }
    return View(viewModel);
}

现在,我将 post 请求正文中的以下表单值发送到与该操作对应的 URL(在 Fiddler 请求生成器中手动):

  • 内容.Name1=X

    这工作正常,Name1属性已填写viewModel.Content, Name2 is null并且模型状态无效,因为Name2是必须的。因此,验证按预期失败。

  • 内容.名称 1=X or Name1=X或其他任何东西,这样就没有任何东西可以绑定到viewModel

    Now viewModel.Content is not null(因为我在构造函数中实例化它)但所有属性Name1 and Name2 are null。这是预料之中的。我做了什么not期望模型状态是valid,因此它通过了验证(稍后会导致数据库异常,因为存在不可为空的列)。

如何改进此代码,以便验证在第二种情况下也能正常工作?

我做了三个实验:

  • 我已经删除了实例化Content in the ParentViewModel构造函数,那么Content is null在上面的第二个示例中,但验证仍然通过。

  • 我添加了一个[Required]归因于Content属性(但没有删除Content in the ParentViewModel构造函数)。这根本没有影响,上面两个测试所描述的行为是相同的。

  • 我添加了一个[Required]归因于Content财产and删除了实例化Content in the ParentViewModel构造函数。这似乎按我想要的方式工作:在第二个测试中Content is null并且由于以下原因验证失败[Required]属性。它看起来像这样:

    public class ParentViewModel
    {
        [Required]
        public ChildViewModel Content { get; set, }
    }
    
    public class ChildViewModel
    {
        [Required]
        public string Name1 { get; set, }
        [Required]
        public string Name2 { get; set, }
    }
    

我现在得出结论,实例化Content儿童财产在ParentViewModel构造函数是问题的根源,并且模型绑定器本身必须实例化子属性(如果请求中没有匹配的表单字段,则必须实例化子属性)才能正常工作的服务器端验证。

我在其他几个视图模型构造函数中都有子属性实例化,直到现在才注意到这个问题。那么,这通常是一种不好的做法吗?还有其他方法可以解决这个问题吗?


ModelState.IsValid 告诉您是否有任何模型错误已添加到 ModelState。

默认模型绑定器将为基本类型转换问题添加一些错误,例如为“int”传递非数字。您可以根据您使用的任何验证系统更全面地填充 ModelState。我建议研究数据注释来验证 ViewModel,因为它运行良好。

此语法可能是错误的或旧的。 ModelState.AddModelError("key", 异常)

转述自ModelState.IsValid 在 NerdDinner 的 ASP.NET MVC 中有效吗? https://stackoverflow.com/questions/881281/what-is-modelstate-isvalid-valid-for-in-asp-net-mvc-in-nerddinner

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

嵌套 ViewModel 的验证 的相关文章

随机推荐

  • 对 mysql_real_escape_string 的每次调用都需要再次访问数据库吗?

    http php net manual en function mysql real escape string php http php net manual en function mysql real escape string ph
  • 如何在android xml中构建梯形形状?

    我想建立这个shape with bottom line and text在里面我有点困惑如何实现这个我累了 一些代码但没有得到所需的东西 到目前为止我已经尝试过这段代码 形状 xml
  • 以编程方式更改 Windows XP 中的默认代码页? (来自德尔福)

    谁能建议如何以编程方式更改默认的 Windows XP 代码页 我是在 Delphi 中执行此操作 这相当于进入控制面板 gt 区域设置 gt 非 Unicode 应用程序的语言 在这种情况下 我想切换到中文 中国 因此正在写入以下注册表字
  • HTML5 视频 - iPhone 上的当前时间设置不正确

    我设置了一个基本的 HTML5 视频 从中加载四个视频之一 我遇到的问题是 当我加载下一个视频时 它会从上一个时间位置继续播放 努力设定currentTime财产似乎要么是短暂的 要么是完全被忽视的 我已将侦听器添加到事件集合中 并且每个事
  • 将多个滤色器应用于同一个可绘制对象

    我想将多个滤色器串联应用到可绘制对象 那可能吗 或者也许创建一个过滤器 它是我想要应用的过滤器的组合 例如 我想要 Drawable d d setColorFilter 0x3F000000 Mode OVERLAY setColorFi
  • strlen 和 malloc:C 内存泄漏

    这个问题是无效的 我没有正确地释放学生 我会尽快接受向我透露这一点的答案 我是 C 新手 正在练习 malloc 从宏观上讲 我正在编写一个链表库 这个 create student 函数是我将用来测试我的链表库的许多函数之一 问题是 我运
  • 如何动态查看PL/SQL中变量的类型?

    此链接显示如何在 Oracle 中获取过程 函数变量的类型 查看变量的类型 https stackoverflow com questions 17134293 how to view the type of a variable in p
  • 为什么在大多数编程语言中数组索引都是从零开始的?

    C C C D Java 都是从零开始的 Matlab 是我所知道的唯一从 1 开始的语言 在 C 和 C 中 数组是从零开始的 因为它表示距项目列表开头的偏移量 这两行在 c 中具有相同的结果 anArray 3 4 anArray 3
  • NameError——当脚本分解为多个 python 文件时导入的模块

    很难找到这个问题的标题 希望这个线程不是重复的 我正在为一个项目使用 Python 2 7 使用 PyCharm 2016 2 2 编写这么长的脚本 并决定将其拆分为不同的 py 文件 然后我可以将其导入到主文件中 不幸的是 似乎在代码中较
  • 通知徽章在 Android O 中不起作用

    在 Android O 开发者预览版中 谷歌引入了通知徽章 这些徽章应该显示在启动器图标上 我正在使用来自开发通道的 Android O 模拟器 我编写了一个简单的代码来显示通知徽章 但它似乎不起作用 Notification notifi
  • C++ 文本文件读取

    所以我需要一点帮助 我目前有一个文本文件 其中包含以下数据 myfile txt b801000000 我想做的是将 b801 等数据读取为位 这样我就可以获取值 0xb8 0x01 0x00 0x00 0x00 目前我正在使用以下 typ
  • 从 pug 读取环境变量

    我正在使用 pug 编译静态 html 我自己的静态站点生成器 有点 除了 package json 文件中的这一行之外 我没有 node js 服务器代码 watch pages pug O options json w pages ou
  • 在 DaemonSet 中处理 PersistentVolumeClaim

    我有一个DaemonSet创建 flink 任务管理器 Pod 每个节点一个 Nodes 假设我有两个节点 node A node B Pods daemonSet 将创建 节点 A 上的 pod A 节点 B 上的 pod B 持久数量声
  • Access 数据库错误“找不到文件”?

    我已经使用 Access 数据库作为选择数据库很长时间了 这是我第一次遇到以下错误消息 Could not find file C Program Files Common Files Microsoft Shared DevServer
  • 在azure APIM中为同一功能应用程序创建2个不同的端点

    我有单个天蓝色功能应用程序 我想在 Azure APIM 中创建 2 个不同的 API 端点 我怎样才能做到这一点 According to some test it seems we can t implement the require
  • ByteBuddy:新定义的字段通过反射不可见

    我在代理中使用 ByteBuddy 向测试程序中的每个 Runnable 添加跟踪变量 new AgentBuilder Default with AgentBuilder LambdaInstrumentationStrategy ENA
  • 如何使用 Ruby 或 Nokogiri 获取页面的原始 HTML 源代码?

    我在用着Nokogiri http nokogiri org Ruby Xpath 库 用于 grep 网页上的内容 然后我发现一些网页有问题 比如Ajax网页 这意味着当我查看源代码时 我不会看到确切的内容 比如 table etc 如何
  • pandas:无法从重复轴重新索引

    我有这个代码 missing columns list set model header set combined data columns if missing columns combined data combined data re
  • iOS 10 中 UIWebView 顶部的灰色条

    当我从 Xcode 中的对象库拖动 UIWebView 时 我得到一个顶部带有深灰色条的 UIWebView 那是什么 我怎样才能摆脱它 你需要把self automaticallyAdjustsScrollViewInsets NO 在V
  • 嵌套 ViewModel 的验证

    我有两个 ViewModel 简化 public class ParentViewModel public ParentViewModel Content new ChildViewModel public ChildViewModel C