You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ViewModel内部嵌套Model的ModelState验证未生效问题求助

ViewModel内部嵌套Model的ModelState验证未生效问题求助

嗨,我来帮你拆解下问题出在哪,你遇到的其实是ASP.NET MVC验证机制里几个容易踩的小坑:

1. 验证触发的时机不对

ASP.NET MVC的ModelState验证默认只会在POST请求的模型绑定阶段自动执行,而你现在是在Get请求里初始化模型并返回视图,这时候框架不会主动帮你验证模型属性。哪怕Name是null且加了[Required],也不会自动把错误塞进ModelState里。

2. 视图里的字段引用有笔误

你的SampleViewModel里的属性是Property1,但视图里写的是@Html.DisplayFor(m=>m.Model1.Name)——这里的Model1是类型名不是属性名,得改成m=>m.Property1.Name,不然验证消息连对应的字段都找不到。

3. 缺少输入控件(针对提交场景)

你用的DisplayFor只是文本显示辅助方法,不是输入控件。如果后续要提交表单,没有对应的输入字段(比如TextBoxFor),模型绑定的时候根本不会处理这个Name属性,自然也触发不了验证。


分场景解决办法:

场景1:想在页面刚加载时就显示验证错误

如果要在Get请求加载页面时就提示Name不能为空,需要在Controller里手动触发验证

public ActionResult Index()
{
    Model1 a = new Model1();
    SampleViewModel s = new SampleViewModel();
    s.Property1 = a;
    
    // 手动触发验证,把错误加入ModelState
    TryValidateModel(s);
    
    return View(s);
}

同时修正视图里的代码,换成输入控件才能正常显示验证提示:

@Html.TextBoxFor(m=>m.Property1.Name)
@Html.ValidationMessageFor(m=>m.Property1.Name)

小提醒:TryValidateModel会返回布尔值表示验证是否通过,而ValidateModel如果验证失败会直接抛出异常,根据你的需求选就行。

场景2:针对表单提交的验证(更常见的业务场景)

如果是用户填写表单后提交的场景,只需要做好两点:

  1. 视图里有正确的输入控件和字段引用
  2. 控制器的POST Action接收SampleViewModel参数,框架会自动在模型绑定阶段完成验证:
[HttpPost]
public ActionResult Index(SampleViewModel model)
{
    if (ModelState.IsValid)
    {
        // 验证通过,处理业务逻辑
        return RedirectToAction("Success");
    }
    
    // 验证失败,返回视图显示错误
    return View(model);
}

这样就能正常触发[Required]属性的验证,把错误信息加入ModelState并显示在页面上了。

备注:内容来源于stack exchange,提问作者Jay

火山引擎 最新活动