Как получить идентификаторы ошибочных полей в сводке проверки перед сообщениями проверки - PullRequest
3 голосов
/ 07 марта 2011

Есть ли способ настроить validationSummary, чтобы он мог выводить якорные теги, для которых HREF - это имя поля, для которого отображается сообщение проверки в сводке? Таким образом, используя jquery, я могу добавить события onclick, которые фокусируют поле, когда щелкает тег привязки в сводке проверки.

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

Имя - Пожалуйста, введите ваше имя.

Спасибо.

1 Ответ

4 голосов
/ 07 марта 2011

Я не думаю, что в рамках есть какая-либо функциональность для этого, поэтому вам нужно будет использовать собственный метод расширения.Например:

    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(), вам необходимо создать соответствующие подписи и вызвать предоставленный метод.
...