如何在验证摘要中、验证消息前面获取错误字段的 ID

use*_*490 3 asp.net-mvc validationsummary c#-2.0

有没有办法自定义validationSummary,以便它可以输出锚标记,其HREF是摘要中验证消息显示的字段的名称?这样,使用 jquery,我可以添加 onclick 事件,当在验证摘要上单击锚标记时,这些事件会聚焦于该字段。

这主要针对视障人士,这样当他们出现错误时,验证摘要会聚焦,他们会选择错误条目,带有字段标签的锚点标签会聚焦,屏幕阅读器会先读取锚点,然后读取消息,然后他们可以单击聚焦在错误的字段上。

<a href="#First_Name">名字</a> - 请输入您的名字。

谢谢。

det*_*lor 5

我认为框架内没有任何功能,因此您需要使用自定义扩展方法。例如:

    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);
    }
Run Code Online (Sandbox Code Playgroud)

这是使用框架内现有的扩展方法并更改插入列表中的标签。这是一个快速示例,在使用之前需要考虑一些事项:

  • 这不会对错误消息进行编码,因为我已经使用了现有的html.ValidationMessage. 如果您需要对消息进行编码,那么您需要包含代码来提供默认消息和任何本地化要求。
  • 由于使用现有的 ValidationMessage 方法,锚点内有一个 span 标记。如果你想整理你的 HTML 那么应该替换它。
  • 这是常见重载中最复杂的一种。如果您想使用一些更简单的签名,例如html.ValidationSummary()您需要创建相关签名并调用所提供的方法。