为什么ValidationSummary(true)显示属性错误的空摘要?

时间:2012-08-24 10:05:21

标签: asp.net-mvc-3

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

enter image description here

如果没有属性错误,则不显示验证摘要。对于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" />
}

11 个答案:

答案 0 :(得分:33)

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

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

答案 1 :(得分: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)

答案 2 :(得分:16)

检查this问题。

您可以使用 CSS 隐藏摘要:

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

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

之前

答案 3 :(得分:5)

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

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

答案 4 :(得分:2)

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

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

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

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

答案 5 :(得分: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;
    }
}

答案 6 :(得分:1)

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

@Html.ValidationSummary(false)

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

答案 7 :(得分:1)

ValidationSummary接受可选的message参数。如果设置此参数,则该框看起来不会很傻。

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

enter image description here

答案 8 :(得分:0)

@if(ViewContext.ViewData.ModelState.Count&gt; 0)

{

//您的内容

}

会像魅力一样工作。

答案 9 :(得分: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,因此完全不显示它就可以了。希望对您有所帮助。

答案 10 :(得分:-1)

执行此操作的验证脚本。

将以下内容更改为web.config

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

应该是 false