您有无数种选择。如果您只想显示由此创建的消息:
ModelState.AddModelError(string.Empty, "Login failed");
你只需要在你的视图中:
@Html.ValidationMessage(String.Empty)
不过,这会将消息包装在 <span class="field-validation-error"></span> 中,但如果您愿意,可以轻松覆盖默认样式。
但是根据您上面描述的用例,听起来您需要的只是一个静态(ish)图例,用于解释“存在验证错误。无效字段已突出显示。" 每当屏幕上出现一个或多个验证失败时。
那么这个怎么样:
namespace MvcApplication.Web.Extensions
{
public static class HtmlHelperExtensions
{
private const string ValidationLegendHtml =
"<div class=\"validation-legend\">{0}</div>";
private const string DefaultValidationLegend =
"There are validation errors. The invalid fields have been highlighted";
public static MvcHtmlString ValidationLegend(
this HtmlHelper htmlHelper, string message = DefaultValidationLegend)
{
if(htmlHelper.ViewData.ModelState.IsValid)
{
return null;
}
return new MvcHtmlString(String.Format(ValidationLegendHtml, message));
}
}
}
然后在视图中你只需要插入:
@Html.ValidationLegend() //Use the default legend message
@Html.ValidationLegend("Something went wrong!") //Specific message
如果表单无效,这将显示图例,并且在其有效时完全不可见!
您还需要将新扩展的命名空间添加到您的 Views/web.config(不要与根 web.config 混淆),如下所示:
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<!-- Add Me! -->
<add namespace="MvcApplication.Web.Extensions"/>
</namespaces>
</pages>
不幸的是,这不会为您提供新扩展方法的智能感知,如果这很重要,您可以选择(或另外)在 @model 声明之后立即将扩展的 using 语句添加到视图顶部,如下所示:
@model MvcApplication.Web.Models.LoginModel
@using MvcApplication.Web.Extensions
编辑
如果您还想支持显示此客户端,请将扩展名更改为:
public static MvcHtmlString ValidationLegend(
this HtmlHelper htmlHelper, string message = DefaultValidationLegend)
{
var tagBuilder = new TagBuilder("div");
tagBuilder.SetInnerText(message);
tagBuilder.AddCssClass("validation-legend");
if(htmlHelper.ViewData.ModelState.IsValid)
{
tagBuilder.AddCssClass("hide");
}
return new MvcHtmlString(tagBuilder.ToString());
}
确保您有 .hide { display: none; } CSS 规则。
再次编辑
您可以让 jquery.validate 自动为您显示/隐藏图例,方法是将 errorContainer 配置设置的默认值设置为匹配图例的 CSS 类。这可以通过声明脚本包含来完成,如下所示:
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"
type="text/javascript"></script>
<script type="text/javascript">
jQuery.validator.setDefaults({ errorContainer: '.validation-legend' });
</script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"
type="text/javascript"></script>
注意在jquery.validate 脚本标签之后 而在jquery.validate.unobtrusive 脚本标签之前 的setDefaults 调用。这个顺序很重要。另请注意,任何验证错误都会显示所有 .validation-legend,因此如果您有任何具有两个不同验证图例的屏幕,您可能需要更花哨一些。