ASP.NET MVC3 TryValidateModel 验证整个模型集合,而不仅仅是单个实例

标签 asp.net asp.net-mvc asp.net-mvc-3

我有一个需要模型列表的操作。我想同时验证每个模型与整个模型集合。我正在尝试使用 TryValidateModel,但似乎如果我的任何一个模型无效,那么所有模型都无效。我的表单显示 5 个 SurveyResponseModel(一个包含两个必需字符串和两个整数的类)。如果我完整填写所有五个模型,我会得到下面的 validCount = 5。但是,如果五个模型中的任何一个不完整(因此验证失败),我得到的 validCount 为 0。这是 TryValidateModel 的预期行为吗?如果是这样,我对如何一次验证这些有什么想法吗?

    [HttpPost]
    public ActionResult Create(IList<SurveyResponseModel> respondents)
    {
        int validCount = 0;

        foreach (SurveyResponseModel respondent in respondents)
        {
            if (TryValidateModel(respondent))
            {
                validCount++;
            }
        }
        ModelState.AddModelError("", validCount.ToString() + " respondents passed validation");
    }

最佳答案

查看代码,在我看来,TryValidateModel 将验证所提供的对象给定类型的所有模型,而不仅仅是该特定对象本身。此外,它还返回 ModelState.IsValid 属性的当前值,以便一旦存在无效模型,所有对 TryValidateModel 的调用都将返回 false。如果您想做这样的事情,我认为您需要在特定模型实例上自己获取并运行每个模型实例的验证器。

我还认为,当您手动调用模型验证器时,它们已经运行了。您可以通过在循环之前查看 ModelState.IsValid 的值来检查这一点(对于无效模型)。如果为 false,则意味着验证器是由模型绑定(bind)程序运行的,这就是我认为会发生的情况。

您可以在 http://aspnet.codeplex.com/ 找到 MVC 的源代码.

关于ASP.NET MVC3 TryValidateModel 验证整个模型集合,而不仅仅是单个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4798238/

相关文章:

c# - 字符串函数(正则表达式?)从 url 字符串中删除查询字符串对

asp.net - 在 ASP.Net 中加载用户控件并处理回发

c# - 从使用 IIS 部署的 Web 应用程序使用的库中读取 web.config

vb.net - ASP.NET MVC3 Razor @string 点问题

asp.net-mvc-3 - 创建规范 URL,包括 id 和 title slug

asp.net - 如何使用 MSBuild 命令行运行 ASP.NET MVC 应用程序

asp.net-mvc - Asp.net Mvc : Creating a simple cms

javascript - 对同步 AJAX 请求的 ASP.NET MVC 操作

c# - 如何从 App_Start 代码中获取 root Url?

c# - 如何在 Visual Studio 2010 中测试函数?