使用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" />
}
答案 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.")
答案 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