Как отобразить несколько ошибок проверки с @ Html.ValidationMessageFor? - PullRequest
12 голосов
/ 22 ноября 2011

Я вижу, что мой ModelState.Values[x].Errors правильно заполнен двумя ошибками проверки для одного свойства.

Если я использую @Html.ValidationSummary() в моем представлении, оно правильно отображает обе ошибки ....хотя и в верхней части страницы, а не рядом с ошибочным вводом.

Использование @Html.ValidationMessageFor(model => model.MyProperty) отображает только первую ошибку для этого свойства!

Как показать обе ошибки рядом с соответствующим вводом?

Ответы [ 2 ]

12 голосов
/ 23 ноября 2011

Одним из решений является реализация вашего собственного метода расширения в 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)
}
5 голосов
/ 12 декабря 2012

Ответ, предоставленный Дейвом A-W, является по существу правильным, но не будет работать во всех случаях Чтобы получить правильное имя свойства, исходный код MVC 3 использует:

var propertyName = ExpressionHelper.GetExpressionText(expression);

Принимает во внимание любые префиксы в данных формы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...