Как настроить Html.ValidationMessageFor в ASP MVC

Можно ли настроить метод Html.ValidationMessageFor так, чтобы он создавал другой HTML ?

Я хочу сделать что-то похожее на:

<div class="field-error-box">
    <div class="top"></div>
    <div class="mid"><p>This field is required.</p></div>
</div>
21
задан parleer 5 December 2011 в 04:22
поделиться

1 ответ

Я создал ValidationMessageAsStringFor, который просто возвращает сообщение об ошибке как строку. Это - в основном упрощенная версия ValidationMessageFor :

public static MvcHtmlString ValidationMessageAsStringFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
{
    var field = ExpressionHelper.GetExpressionText(expression);
    string modelName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(field);

    if (!helper.ViewData.ModelState.ContainsKey(modelName))
    {
        return null;
    }

    var modelState = helper.ViewData.ModelState[modelName];
    var modelErrors = (modelState == null) ? null : modelState.Errors;
    var modelError = ((modelErrors == null) || (modelErrors.Count == 0)) ? null : modelErrors.FirstOrDefault(m => !String.IsNullOrEmpty(m.ErrorMessage)) ?? modelErrors[0];

    if (modelError == null)
    {
        return null;
    }

    var errorMessage = GetUserErrorMessageOrDefault(helper.ViewContext.HttpContext, modelError, modelState);

    return MvcHtmlString.Create(errorMessage);
}

private static string GetUserErrorMessageOrDefault(HttpContextBase httpContext, ModelError error, ModelState modelState)
{
    if (!string.IsNullOrEmpty(error.ErrorMessage))
    {
        return error.ErrorMessage;
    }

    if (modelState == null)
    {
        return null;
    }

    return modelState.Value?.AttemptedValue;
}

С этим на месте и после импорта пространства имен, содержащего нового помощника, просто создайте HTML-код, в котором Вы нуждаетесь:

<div class="field-error-box">
    <div class="top"></div>
    <div class="mid"><p>@Html.ValidationMessageAsStringFor(m => m.FieldName)</p></div>
</div>
0
ответ дан 29 November 2019 в 20:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: