Можно ли настроить метод Html.ValidationMessageFor так, чтобы он создавал разные HTML?
Я хочу сделать что-то похожее на:
<div class="field-error-box">
<div class="top"></div>
<div class="mid"><p>This field is required.</p></div>
</div>
Можно ли настроить метод Html.ValidationMessageFor так, чтобы он создавал разные HTML?
Я хочу сделать что-то похожее на:
<div class="field-error-box">
<div class="top"></div>
<div class="mid"><p>This field is required.</p></div>
</div>
Я не уверен, что можно использовать 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)
Я использовал другой способ:
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.
Если вам нужны другие перегрузки функции, просто дублируйте при необходимости.
Вы можете реализовать свой собственный помощник 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 из здесь
Единственная потребность в изменении генерации тегов по умолчанию была в моем случае, что влияет на поведение, приводящее к настройкам анонимного поля.
Я решил это, используя "display: block"
Возможно, это помогает некоторым людям.
Возможно, вы можете поместить этот код
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 не отображается в загрузке формы.
Да, просто используйте метамодель для поля:
[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:) Надеюсь, что эта помощь:)