c# - 如何使用ModelState.IsValid通过条件在单个 View 中验证多个ViewModel

标签 c# asp.net-mvc validation mvvm data-annotations

我在验证具有多个ViewModel的一个 View 时遇到问题。我的情况是,我有一个基本表单,对于很多页面来说都是相同的。通过ID参数,我将新的外部字段呈现给此Basic表单。这些外部字段是ActionResult类型,使用自己的ViewModel和自己的Controller。在Post action上的Main controller中,我想控制是否为ModelState.IsValid,但我有问题-它可以验证所有外部字段的所有ViewModel,但是我只想验证 Activity 外部字段的ViewModel(以及Basic窗体)。

看起来像这样:

所有 View 模型的ViewModel

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

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

在Post操作的Basic表单的 Controller 中,我有类似这样的内容,并且我想使用类似以下代码的内容 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?我没有这类表格的经验,所以请耐心等待...

感谢大家的帮助!

最佳答案

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

结果是:当主 View 模型中包含的具有自己的 View 模型的 View 未呈现到 View 中时,此 View 模型将在后期操作中不生效。因此,我的基本表单每次都有效,而ExternalFields仅在呈现时才有效。非常抱歉,如此愚蠢的问题。

关于c# - 如何使用ModelState.IsValid通过条件在单个 View 中验证多个ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23673121/

相关文章:

c# - C#按位运算符

sql-server - 在 ASP.NET MVC 中将 SQL Server 连接到 Azure 数据库

c# - Jquery ajax 调用以在 MVC 中传递 JSON 数组(500 内部服务器错误)

c# - ASP.NET MVC 中的多个 CSS 文件包

javascript - 使用ajax验证表单字段

c# - 异步方法 - 等待和返回任务之间的区别

c# - 有属性的节点列表

php - Laravel Eloquent 验证插入异常?

c# - 在文本框中的不同行上显示数据库中的值 C#

c - 使用 atoi() 对整数进行输入验证