加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 验证嵌套的ViewModels

发布时间:2020-12-16 04:23:02 所属栏目:asp.Net 来源:网络整理
导读:我有两个ViewModel(简化): public class ParentViewModel{ public ParentViewModel { Content = new ChildViewModel(); } public ChildViewModel Content { get; set,}}public class ChildViewModel{ [Required] public string Name1 { get; set,} [Require
我有两个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 Request Builder中手动):

> Content.Name1 = X.

这工作正常,Name1属性填充在viewModel.Content中,Name2为null,模型状态无效,因为Name2是必需的.因此,验证按预期失败.
> Xontent.Name1 = X或Name1 = X或其他任何东西,以便没有任何东西绑定到viewModel

现在viewModel.Content不为null(因为我在构造函数中实例化它),但所有属性Name1和Name2都为null.这是预料之中的.我没想到的是模型状态是有效的,因此它通过了验证(之后导致数据库异常,因为存在非可空列).

如何改进此代码以便验证在第二种情况下也适用?

我做了三个实验:

>我已在ParentViewModel构造函数中删除了Content的实例化,然后在上面的第二个示例中Content为null,但验证仍然通过.
>我在Content属性中添加了[Required]属性(但没有删除ParentViewModel构造函数中Content的实例化).这完全没有效果,上述两个测试的描述行为是相同的.
>我在Content属性中添加了[Required]属性,并删除了ParentViewModel构造函数中Content的实例化.这看起来像我想要的那样:在第二个测试中,Content为null,由于[Required]属性,验证失败.它看起来像这样:

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

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

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

解决方法

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

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

这种语法可能是错误的或旧的. ModelState.AddModelError(“key”,Exception)

转述自
What is ModelState.IsValid valid for in ASP.NET MVC in NerdDinner?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读