MVC 5在一个页面上有多个HtmlHelper.ValidationSummary

Nic*_*ick 4 c# forms asp.net asp.net-mvc

我的登录页面上有两个表单:

  • 寄存器
  • 登录

它们被定义为:

@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { role = "form" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true, "");
    // form controls etc...
}
Run Code Online (Sandbox Code Playgroud)

@using (Html.BeginForm("Register", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { role = "form" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true, "");
    // form controls etc...
}
Run Code Online (Sandbox Code Playgroud)

当我提交其中一个表单并且存在验证错误时,会出现问题,两个验证摘要都会显示错误.

ValidationSummary方法有各种重载(https://msdn.microsoft.com/en-us/library/system.web.webpages.html.htmlhelper.validationsummary(v=vs.111).aspx),但没有一个他们解决了这个问题.

所需的功能是:

  • 如果登录表单上存在验证错误,则错误将显示在登录表单的ValidationSummary上,并且"注册"表单上的ValidationSummary为空白
  • 如果注册表单上存在验证错误,则错误将显示在注册表单的ValidationSummary上,并且"登录"表单上的ValidationSummary为空白

Chr*_*att 5

ValidationSummary只显示所有错误ModelState(只是模型级别或所有错误,具体取决于您为该参数传递的内容).然而,重要的是,多种形式之间没有区别.无论哪种形式有错误,ValidationSummary都会导致出现这些错误,如您所见.

解决这个问题的唯一方法是有条件地展示ValidationSummary.您需要的只是一些可以检查的值,哪些只存在于其中一个表单中.这可能只是一个属性而另一个没有,或者您可以通过使用隐藏输入或向按钮添加name属性来添加特定值.然后:

@if (ModelState.HasKey("MyUniqueKey"))
{
    @Html.ValidationSummary(true)
}
Run Code Online (Sandbox Code Playgroud)

  • 我不得不使用`@if(ViewData.ModelState.ContainsKey("MyUniqueKey")) {@Html.ValidationSummary(true)}`,但想法是一样的。 (2认同)