首页 文章

如何使用ModelState.IsValid通过条件在单个视图中验证多个ViewModel

提问于
浏览
1

我在使用多个ViewModel验证一个视图时遇到问题 . 我的情况是,我有一个基本形式,对于很多页面都是一样的 . 通过ID参数,我将新的外部字段呈现给此Basic表单 . 这些外部字段是ActionResult的类型,使用自己的ViewModel和自己的Controller . 在Post操作的主控制器中,我想控制ModelState.IsValid,但我有问题 - 它验证所有外部字段的所有ViewModel,但我想只验证活动外部字段的ViewModel(以及Basic表单) .

它看起来像这样:

所有视图模型的ViewModel

public class AllFieldsVm
{
    public BasicFormVm BasicFormVm { get; set; }
    public ExternalFieldXyVm ExternalFieldXyVm { get; set; }
    public AnotherExternalFieldVm AnotherExternalFieldVm { get; set; }
}

在外部字段的控制器中,我创建 AllFieldsVm 的新实例,并在此创建 ExternalFieldXyVm 的新实例(如果需要,我预填充这些字段) . 当某些条件为真时,我会将局部视图(使用 @{Html.RenderAction("Action", "Controller", new {@someOptionalData = value});} )渲染为whitout布局 .

在Post动作的基本形式的控制器中我有这样的东西,我想使用像这样的代码 if (ModelState.IsValid(model.BasicFormVm) && ModelState.IsValid(model.ExternalFieldXyVm))

[POST("someurl-id{someId}")]
public ActionResult SaveFormData(int someId, AllFieldsVm model)
{
    //Here I want something like 
    //if (ModelState.IsValid(model.BasicFormVm) && ModelState.IsValid(model.ExternalFieldXyVm)) or something like that...

    var se = new SomeEntity();
    se.property1 = model.property1;
    se.property2 = model.property2;

    using (var dbc = _db.Database.BeginTransaction())
    {
        try
        {
            _db.Add(se);
            _db.SaveChanges();

            //My Condition - when save external data
            if (someId == (int) MovementTypes.SomeEnumInt)
            {
                var rd = new ExternalFieldEntity
                    {
                        PropertyA = se.property0,
                        PropertyB = Convert.ToDateTime(model.ExternalFieldXyVm.SomeExternalFieldName)
                    };

                _db.Add(rd);
                _db.SaveChanges();
            }

            dbc.Commit();
        }
        catch (Exception)
        {
            dbc.Rollback();
        }
    }

    return RedirectToAction("Action", "Controller");
}

所以,我的问题是,如何根据某些条件分别验证ExternalFieldXyVm?

是否可以,或者我必须创建所有自己的验证器,而不使用基本的DataAnnotations或FluentValidation?我对这些类型的表格没有经验,所以请耐心等待......

感谢大家的帮助!!

1 回答

  • 1

    太好了,我明白了 . 我玩了两天,不知道我怎么可能没看到 .

    结果是:当使用包含在主视图模型中的自己的视图模型进行查看时,不会将其呈现到视图中,此视图模型不会在后期操作上进行验证 . 所以我的Basic表单每次都是验证,而ExternalFields只在渲染时才会生效 . 对不起,对于这么愚蠢的问题....

相关问题