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

本文关键字:视图 单个 viewmodel 验证 条件 何通过 ModelState IsValid | 更新日期: 2023-09-27 18:03:23

我有一个问题,验证一个视图与多个viewmodel。我的情况是,我有一个基本的形式,这是相同的许多页面。通过ID参数,我将新的外部字段呈现给这个基本表单。这些外部字段是ActionResult的类型,使用自己的ViewModel和自己的Controller。在主控制器上的Post动作,我想控制如果ModelState。IsValid,但我有问题-它验证所有外部字段的所有ViewModel,但我想验证只有ViewModel的活动外部字段(和基本形式太)。

它看起来像这样:

所有视图模型的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});}),当一些条件为真。

在Post action的Basic窗体的控制器中,我有这样的东西,我想使用这样的代码 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?我对这些类型的表格没有经验,所以请耐心等待……

感谢所有的帮助!!

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

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

结果是:当包含在主视图模型中的具有自己的视图模型的视图没有呈现到视图中时,该视图模型在post action上不被验证。所以我的基本表单每次都是验证,而外部字段只有在呈现时才验证。很抱歉,这个愚蠢的问题....