Как получить идентификаторы ошибочных полей в сводке проверки перед сообщениями проверки
Есть ли способ настроить validationSummary, чтобы он мог выводить якорные теги, для которых HREF - это имя поля, для которого отображается сообщение проверки в сводке? Таким образом, используя jquery, я могу добавить события onclick, которые фокусируют поле, когда щелкает тег привязки в сводке проверки.
Это в первую очередь для людей с нарушениями зрения, поэтому, когда у них есть ошибки, фокус проверки сводится к вкладке с ошибкой, метка привязки с меткой поля фокусируется, и программа чтения с экрана считывает привязку, а затем сообщение, после чего они могут нажать на якоре, чтобы сосредоточиться на ошибочном поле.
Имя - введите свое имя.
Благодарю.
1 ответ
Я не думаю, что для этого есть какие-то функциональные возможности, поэтому вам нужно будет использовать собственный метод расширения. Например:
public static string AccessibleValidationSummary(this HtmlHelper htmlHelper, string message, IDictionary<string, object> htmlAttributes)
{
// Nothing to do if there aren't any errors
if (htmlHelper.ViewData.ModelState.IsValid)
{
return null;
}
string messageSpan;
if (!String.IsNullOrEmpty(message))
{
TagBuilder spanTag = new TagBuilder("span");
spanTag.MergeAttributes(htmlAttributes);
spanTag.MergeAttribute("class", HtmlHelper.ValidationSummaryCssClassName);
spanTag.SetInnerText(message);
messageSpan = spanTag.ToString(TagRenderMode.Normal) + Environment.NewLine;
}
else
{
messageSpan = null;
}
StringBuilder htmlSummary = new StringBuilder();
TagBuilder unorderedList = new TagBuilder("ul");
unorderedList.MergeAttributes(htmlAttributes);
unorderedList.MergeAttribute("class", HtmlHelper.ValidationSummaryCssClassName);
foreach (string key in htmlHelper.ViewData.ModelState.Keys)
{
ModelState modelState = htmlHelper.ViewData.ModelState[key];
foreach (ModelError modelError in modelState.Errors)
{
string errorText = htmlHelper.ValidationMessage(key);
if (!String.IsNullOrEmpty(errorText))
{
TagBuilder listItem = new TagBuilder("li");
TagBuilder aTag = new TagBuilder("a");
aTag.Attributes.Add("href", "#" + key);
aTag.InnerHtml = errorText;
listItem.InnerHtml = aTag.ToString(TagRenderMode.Normal);
htmlSummary.AppendLine(listItem.ToString(TagRenderMode.Normal));
}
}
}
unorderedList.InnerHtml = htmlSummary.ToString();
return messageSpan + unorderedList.ToString(TagRenderMode.Normal);
}
Это использует существующий метод расширения изнутри платформы и изменяет тег, который вставляется в список. Это быстрый пример, и есть несколько моментов, которые следует учитывать перед использованием:
- Это не кодирует сообщение об ошибке, так как я использовал существующие
html.ValidationMessage
, Если вам нужно закодировать сообщение, вам нужно будет включить код для предоставления сообщений по умолчанию и любых требований локализации. - Из-за использования существующего метода ValidationMessage внутри якоря есть тег span. Если вы хотите привести в порядок свой HTML, его следует заменить.
- Это самая сложная из обычных перегрузок. Если вы хотите использовать некоторые из более простых, таких как
html.ValidationSummary()
тогда вам нужно будет создать соответствующие подписи и вызвать предоставленный метод.