3

要約内の検証メッセージが表示されているフィールドの名前であるHREFであるアンカータグを出力できるように、validationSummaryをカスタマイズする方法はありますか?このように、jqueryを使用して、検証サマリーでアンカータグがクリックされたときにフィールドにフォーカスするonclickイベントを追加できます。

これは主に視覚障害者向けであるため、エラーが発生すると、検証の概要がフォーカスされ、エラーエントリにタブで移動し、フィールドラベルが付いたアンカータグがフォーカスされ、スクリーンリーダーがアンカーを読み取ってからメッセージを読み上げ、クリックできるようになります。誤ったフィールドに焦点を合わせるためにアンカーに。

<ahref = "#First_Name">名</a>-名を入力してください。

ありがとう。

4

1 に答える 1

4

フレームワーク内にこのための機能はないと思うので、カスタム拡張メソッドを使用する必要があります。例えば:

    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メソッドを使用しているため、アンカー内にスパンタグがあります。HTMLを整理したい場合は、これを置き換える必要があります。
  • これは、通常のオーバーロードの中で最も複雑です。そのような単純なものを使用したい場合はhtml.ValidationSummary()、関連する署名を作成し、提供されたメソッドを呼び出す必要があります。
于 2011-03-07T17:48:39.827 に答える