Одним из решений является реализация вашего собственного метода расширения в HtmlHelper, который делает что-то отличное от поведения ValidationMessageFor по умолчанию.Пример метода @ Html.ValidationMessagesFor, приведенный ниже, объединит несколько сообщений об ошибках, которые были добавлены в ModelState во время проверки на стороне сервера (только).
public static MvcHtmlString ValidationMessagesFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null)
{
var propertyName = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).PropertyName;
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);
}
// Return standard ValidationMessageFor, overriding the message with our concatenated list of messages.
return htmlHelper.ValidationMessageFor(expression, msgs.ToString(), htmlAttributes as IDictionary<string, object> ?? htmlAttributes);
}
// Revert to default behaviour.
return htmlHelper.ValidationMessageFor(expression, null, htmlAttributes as IDictionary<string, object> ?? htmlAttributes);
}
Это полезно, если у вас естьпользовательская проверка бизнеса, которую вы применяете ко всей коллекции, принадлежащей вашей модели (например, перекрестной проверке итогов), или проверяете модель в целом.
Пример, использующий это, где коллекция Order.LineItemsпроверены на стороне сервера:
@using MyHtmlHelperExtensions // namespace containing ValidationMessagesFor
@using (Html.BeginForm())
{
@Html.LabelFor(m => m.LineItems)
<ul>
@Html.EditorFor(m => m.LineItems)
</ul>
@Html.ValidationMessagesFor(m => m.LineItems)
}