我不認爲框架中有任何功能,因此您需要使用自定義擴展方法。例如:
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()
那麼你需要創建相關的簽名並調用所提供的方法。
輝煌的解決方案! – user648490