35

我在使用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" />
}
4

11 回答 11

35
@if (ViewContext.ViewData.ModelState.Where(x => x.Key == "").Any())
{
    @Html.ValidationSummary(true, null, new { @class = "ui-state-error" })
}

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

于 2013-09-29T00:26:06.217 回答
27

我认为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)
于 2012-08-24T14:25:38.603 回答
21

也检查这个问题。

您可以使用CSS隐藏摘要:

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

此外,您可以将验证摘要放在Html.BeginForm().

于 2013-06-25T13:59:33.997 回答
6

另一种方法是检查是否有任何 li 元素,如果不只是隐藏验证摘要错误

<script type="text/javascript">
     $(document).ready(function () {
          if ($(".validation-summary-errors li:visible").length === 0) {
               $(".validation-summary-errors").hide();
          }
     });
</script>
于 2013-03-11T17:23:38.110 回答
2

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

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

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

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

于 2013-02-12T17:48:31.787 回答
1

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;
    }
}
于 2014-03-04T12:13:46.647 回答
1

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

@Html.ValidationSummary(false)

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

于 2016-08-11T19:02:39.927 回答
1

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

{

//你的内容

}

会像魅力一样工作。

于 2017-01-10T13:54:19.030 回答
1

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

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

在此处输入图像描述

于 2019-04-04T15:40:36.187 回答
0

我知道这个话题很老了,但即使在 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,因此根本不呈现它就可以了。我希望这对你们中的一些人有所帮助。

于 2020-07-10T14:55:59.557 回答
-1

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

更改以下 web.config

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

应该是假的

于 2015-06-19T13:25:19.160 回答