Подтвердить что ты не робот

Как настроить 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>
4b9b3361

Ответ 1

Я не уверен, что можно использовать p aragraph вместо default span, так как это может сделать невозможным для плагина проверки для размещения сообщений об ошибках. Но для div -s это просто - вы можете написать собственный html-помощник.

Что-то в этом направлении (может потребоваться дальнейшее тестирование/кодирование). Вам нужно будет указать пространство имен этого статического метода расширения в вашем представлении или напрямую разместить его в System.Web.Mvc.Html.

public static class Validator
{
    public static MvcHtmlString MyValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
    {
        TagBuilder containerDivBuilder = new TagBuilder("div");
        containerDivBuilder.AddCssClass("field-error-box");

        TagBuilder topDivBuilder = new TagBuilder("div");
        topDivBuilder.AddCssClass("top");

        TagBuilder midDivBuilder = new TagBuilder("div");
        midDivBuilder.AddCssClass("mid");
        midDivBuilder.InnerHtml = helper.ValidationMessageFor(expression).ToString();

        containerDivBuilder.InnerHtml += topDivBuilder.ToString(TagRenderMode.Normal);
        containerDivBuilder.InnerHtml += midDivBuilder.ToString(TagRenderMode.Normal);

        return MvcHtmlString.Create(containerDivBuilder.ToString(TagRenderMode.Normal));
    }
}

Как вы видите, это использует метод по умолчанию ValidationMessageFor, чтобы не мешать обработке сообщений об ошибках проверки правильности.

И вы используете это просто, в качестве вспомогательного сообщения для проверки подлинности по умолчанию

@Html.MyValidationMessageFor(model => model.SomeRequiredField)

Ответ 2

Я использовал другой способ:

    public static MvcHtmlString DivValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
    {
        return MvcHtmlString.Create(htmlHelper.ValidationMessageFor(expression).ToString().Replace("span", "div"));
    }

Таким образом вы можете использовать встроенный способ, но замените span на div.

Если вам нужны другие перегрузки функции, просто дублируйте при необходимости.

Ответ 3

Вы можете реализовать свой собственный помощник ValidationMessageFor, чтобы исправить ваш желаемый результат или использовать некоторый javascript для добавления/изменения отображаемого HTML-кода, но пользовательская реализация ValidationMessageFor - это более чистый подход IMHO.

Чтобы реализовать свой собственный метод ValidationMessageFor, ознакомьтесь с методами ValidationExtensions.ValidationMessageFor и ValidationMessageHelper в исходном коде ASP.NET MVC.

Рекомендации по внедрению

Поскольку GetFormContextForClientValidation является внутренним, вы должны обойти эту реализацию, дублируя внутреннюю функциональность вашего кода:

FormContext formContext = htmlHelper.ViewContext.ClientValidationEnabled ? htmlHelper.ViewContext.FormContext : null;

Некоторые другие методы являются частными в ValidationExtensions, например GetUserErrorMessageOrDefault, которые вам нужно будет дублировать и для этого кода. То, что вы можете сделать, чтобы избежать дублирования кода, - это позволить ValidationExtentensions.ValidationMessageДля отображения строки сообщения проверки, которая завернута в диапазон, а затем измените отображаемую строку в соответствии с вашими требованиями. Имейте в виду, что "null" возвращается в случае, если ошибка не найдена и вам понадобятся атрибуты data-HTML, если у вас есть ненавязчивый JavaScript.

Вы можете загрузить исходный код ASP.NET MVC 3 из здесь

Ответ 4

Единственная потребность в изменении генерации тегов по умолчанию была в моем случае, что влияет на поведение, приводящее к настройкам анонимного поля.

Я решил это, используя "display: block"

Возможно, это помогает некоторым людям.

Ответ 5

Возможно, вы можете поместить этот код

string propertyName = ExpressionHelper.GetExpressionText(expression);
string name = helper.AttributeEncode(helper.ViewData.TemplateInfo.GetFullHtmlFieldName(propertyName));

if (helper.ViewData.ModelState[name] == null ||
    helper.ViewData.ModelState[name].Errors == null ||
    helper.ViewData.ModelState[name].Errors.Count == 0)
    {
        return MvcHtmlString.Empty;
    }

поверх ответной функции, так что div не отображается в загрузке формы.

Ответ 6

Да, просто используйте метамодель для поля:

[MetadataType(typeof(YourMetaData))]
public partial class YOURCLASS
{
    [Bind(Exclude = "objID")]
    public class YourMetaData
    {
        [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter a name")]
        public object Name { get; set; }
    }
}

Измените свое сообщение в поле ErrorMessage:) Надеюсь, что эта помощь:)