【问题标题】:Why is ValidationSummary(true) displaying an empty summary for property errors?为什么 ValidationSummary(true) 显示属性错误的空摘要?
【发布时间】:2012-08-24 10:05:20
【问题描述】:

我在使用 ValidationSummary(true) 显示模型级别错误时遇到了一点问题。如果 ModelState 不包含模型错误(即ModelState.AddModelError("", "Error Description"))但包含属性错误(使用数据注释添加),它将显示没有错误信息的验证摘要(当您查看源代码时)。因此,我的 css 显示一个空的红色框,如下所示:

如果没有属性错误,则不会显示验证摘要。对于ValidationSummary(true),我希望它仅在存在模型错误时才显示验证错误。我误会了什么?

我有一个基本项目如下:

控制器:

public class HomeController : Controller
{
    public ViewResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(IndexViewModel model)
    {
        return View();
    }
}

型号:

public class IndexViewModel
{
    [Required]
    public string Name { get; set; }
}

查看:

@model IndexViewModel

@Html.ValidationSummary(true)

@using(@Html.BeginForm())
{
    @Html.TextBoxFor(m => m.Name)
    <input type="submit" value="submit" />
}

【问题讨论】:

标签: asp.net-mvc-3


【解决方案1】:
@if (ViewContext.ViewData.ModelState.Where(x => x.Key == "").Any())
{
    @Html.ValidationSummary(true, null, new { @class = "ui-state-error" })
}

这会检查是否存在任何模型范围的错误,并且仅在有错误时才呈现摘要。

【讨论】:

  • 我认为自定义助手(如接受答案)但使用此条件检查会更好 - 现在我刚刚使用了这个内联。为了节省一些输入,您可以使用以下命令:@if(ViewData.ModelState.Any(_ => _.Key == string.Empty)) { ... }。我总是更喜欢使用 string.Empty 而不是 "" 因为它显示了明确的意图,因为键入它需要额外的努力,而 "" 可能只是有人被跟踪并忘记回来填写它。
  • 不用Any枚举key,可以直接使用ContainsKey:if (ViewContext.ViewData.ModelState.ContainsKey(string.Empty))
【解决方案2】:

我认为ValidationSummary 辅助方法有问题。您可以轻松地创建一个自定义帮助方法来包装内置的ValidationSummary

public static MvcHtmlString CustomValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors)
{
  var htmlString = htmlHelper.ValidationSummary(excludePropertyErrors);

  if (htmlString != null)
  {
    XElement xEl = XElement.Parse(htmlString.ToHtmlString());

    var lis = xEl.Element("ul").Elements("li");

    if (lis.Count() == 1 && lis.First().Value == "")
      return null;
  }

  return htmlString;
}

那么在你看来,

@Html.CustomValidationSummary(true)

【讨论】:

  • 看来这也是我当前 MVC4 的问题?我最终决定采用这个解决方案,它工作正常。感谢您的帮助。
【解决方案3】:

也检查this问题。

您可以使用 CSS 隐藏摘要:

.validation-summary-valid { display:none; }

另外,您可以将验证摘要放在Html.BeginForm() 之前。

【讨论】:

    【解决方案4】:

    另一种方法是检查是否有任何 li 元素,如果不只是隐藏validation-summary-errors

    <script type="text/javascript">
         $(document).ready(function () {
              if ($(".validation-summary-errors li:visible").length === 0) {
                   $(".validation-summary-errors").hide();
              }
         });
    </script>
    

    【讨论】:

      【解决方案5】:

      我知道已经找到了一种解决方法,但我遇到了类似的问题,但有一个更简单的解决方案。

      您的验证摘要呈现是否使用 css 类“validation-summary-valid”或“validation-summary-errors”?第一个类在验证摘要为空时应用,第二个在填充时应用。

      我注意到如果验证摘要不包含错误,则会呈现占位符 div,因此如果任何字段验证失败,客户端验证可以显示它。

      在默认的 MVC 样式表 'Site.css' 中,他们只是禁止使用 'display:none;' 显示空验证摘要 例如.validation-summary-valid { 显示:无; }

      【讨论】:

      • 这是不正确的。如果有任何错误(无论是在模型级别还是属性级别),则始终应用 validation-summary-errors 类。 validation-summary-valid 仅在没有错误时应用。因此,如果您使用的是 Html.ValidationSummary(true) 并且添加了类 validation-summary-errors 的空 div,即使只有属性级错误而没有模型级错误也是如此。 (我们在登录表单中遇到同样的情况,我们使用任一模型级或属性级错误消息,而不是两者。
      【解决方案6】:

      Bootstrap 类修复的另一个变体是:

      public static class ValidationSummaryExtensions
      {
          public static MvcHtmlString CleanValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors, string message = null)
          {
              if(htmlHelper == null) throw new ArgumentNullException("htmlHelper");
      
              MvcHtmlString validationSummary = null;
              if (htmlHelper.ViewData.ModelState.ContainsKey(string.Empty))
              {
                  var htmlAttributes = new { @class = "alert alert-danger" };
                  validationSummary = htmlHelper.ValidationSummary(excludePropertyErrors, message, htmlAttributes);
              }
      
              return validationSummary;
          }
      }
      

      【讨论】:

        【解决方案7】:

        @if (ViewContext.ViewData.ModelState.Count > 0)

        {

        //你的内容

        }

        会像魅力一样工作。

        【讨论】:

          【解决方案8】:

          我遇到了这个空的验证摘要问题。我只是将excludePropertyErrors 设置为 false - 它会将错误添加到验证摘要中。

          @Html.ValidationSummary(false)
          

          我意识到这不一定是这里要问的问题 - 尽管这确实解决了空验证摘要问题 - 如果您遇到此问题,这是一个选项。

          【讨论】:

          • 谢谢,不知道我是怎么错过第一个参数值的,但这肯定有帮助。
          【解决方案9】:

          ValidationSummary 接受可选的消息参数。如果你设置了这个参数,那么这个盒子就不会看起来那么傻了。

          @Html.ValidationSummary(true, "Sorry, that didn't work. Please check the details submitted and try again.")
          

          【讨论】:

            【解决方案10】:

            我知道这个话题已经过时了,但即使在 MVC 5 中这种行为仍然存在。这绝对不是我们大多数人所期望的行为。当我们想要一个“非属性”的 ModelState 错误时,我们这样做:

            ModelState.AddModelError(string.Empty, ex.Message);
            

            由于我们只想在空键存在时显示摘要,因此这个 HtmlHelper 可以解决问题并且比 IMO 接受的答案更干净:

            public static MvcHtmlString CustomValidationSummary(this HtmlHelper htmlHelper,
                bool excludePropertyErrors, string message = null)
            {
                // Don't render summary if there are no empty keys when excluding property errors
                if (excludePropertyErrors && !htmlHelper.ViewData.ModelState.ContainsKey(string.Empty))
                    return null;
            
                // Use default
                return htmlHelper.ValidationSummary(excludePropertyErrors, message);
            }
            

            排除属性错误时,您可能不需要可用于客户端验证的摘要 DIV,因此根本不呈现它就可以了。我希望这对你们中的一些人有所帮助。

            【讨论】:

              【解决方案11】:

              这是执行此操作的验证脚本。

              更改以下web.config

              <add key="ClientValidationEnabled" value="false" />
              

              应该是false

              【讨论】:

              • 这不会禁用整个网站的客户端验证脚本吗?如果我想使用客户端验证脚本怎么办?
              • 这正是问题所在。 Html.ValidationSummary 实际上正在呈现错误消息......它们存在于 HTTP 响应流中,但它们不在页面的最终 HTML 中。客户端 SCRIPT 正在删除它们,确实如此。多么糟糕的配置。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-04-11
              • 2021-03-06
              • 1970-01-01
              相关资源
              最近更新 更多