我在MVC中使用ValidationMessage控件。验证每个属性时,可能会显示多条错误消息,但ValidationMessage仅显示列表中的第一条错误消息。
下面是一个示例:
ModelState["Key"] = new ModelState();
ModelState["Key"].Errors.Add("Error 1");
ModelState["Key"].Errors.Add("Error 2");在我拥有的html中:<%= Html.ValidationMessage("Key")%>
其中显示:"Error 1"
我想看到页面上的所有错误消息,这将是"Error 1 Error 2"
你知道怎么做吗?
发布于 2010-06-29 05:15:03
我遇到了完全相同的问题,所以我为HtmlHelper创建了一个扩展方法,作为MVC ValidationMessage方法的替代。
与ValidationSummary方法相比,这种方法的好处是它显示每个字段的错误消息,因此您可以将其放在每个字段的旁边(与ValidationMessage方法相同)。
public static string AllValidationMessage(this HtmlHelper helper, string modelName)
{
StringBuilder builder = new StringBuilder();
TagBuilder ulTag = new TagBuilder("ul");
ulTag.AddCssClass("u-error-list");
builder.Append(ulTag.ToString(TagRenderMode.StartTag));
if (helper.ViewData.ModelState.ContainsKey(modelName) &&
helper.ViewData.ModelState[modelName].Errors.Count > 0)
{
foreach (var err in helper.ViewData.ModelState[modelName].Errors)
{
TagBuilder liTag = new TagBuilder("li") { InnerHtml = HttpUtility.HtmlEncode(err.ErrorMessage) };
liTag.AddCssClass("u-error-item");
builder.Append(liTag.ToString());
}
}
builder.Append(ulTag.ToString(TagRenderMode.EndTag));
var msgSpan = helper.ValidationMessage(modelName, "{placeholder}");
if (msgSpan == null)
return string.Empty;
return msgSpan.ToHtmlString().Replace("{placeholder}", builder.ToString());
}
public static string AllValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
{
return HtmlHelperExtensions.AllValidationMessage(helper, ExpressionHelper.GetExpressionText(expression));
}编辑:添加AllValidationMessageFor方法
编辑:在msgSpan上添加了null检查
发布于 2009-06-05 16:44:20
对于开箱即用的MVC,您必须添加一个ValidationSummary:
<%= Html.ValidationSummary() %>这将显示所有ModelErrors。
发布于 2013-03-29 03:01:30
基于这里和How to display multiple validation errors with @Html.ValidationMessageFor?中提供的解决方案,我为一个属性创建了自己的多行验证消息。它的行为有点像ValidationSummary,但可以按字段使用。我使用它为模型的一个集合字段提供一条验证消息。这使我可以显示集合的摘要消息,并且只显示集合。
public static MvcHtmlString MultilineValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null)
{
var propertyName = ExpressionHelper.GetExpressionText(expression);
var modelState = htmlHelper.ViewData.ModelState;
// If we have multiple (server-side) validation errors, collect and present them.
if (modelState.ContainsKey(propertyName) && modelState[propertyName].Errors.Count > 1)
{
var msgs = new StringBuilder();
foreach (ModelError error in modelState[propertyName].Errors)
{
msgs.AppendLine(error.ErrorMessage + "<br />");
}
// Return standard ValidationMessageFor, overriding the message with our concatenated list of messages.
var msgSpan = htmlHelper.ValidationMessageFor(expression, "{0}", htmlAttributes as IDictionary<string, object> ?? htmlAttributes);
var msgDiv = msgSpan.ToHtmlString().Replace("span", "div");
return new MvcHtmlString(string.Format(msgDiv, msgs.ToString()));
}
// Revert to default behaviour.
return htmlHelper.ValidationMessageFor(expression, null, htmlAttributes as IDictionary<string, object> ?? htmlAttributes);
}https://stackoverflow.com/questions/956872
复制相似问题