フレームワーク内にこのための機能はないと思うので、カスタム拡張メソッドを使用する必要があります。例えば:
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()
、関連する署名を作成し、提供されたメソッドを呼び出す必要があります。