Как настроить 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>
Ответы
Ответ 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:)
Надеюсь, что эта помощь:)