Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在通过html.ValidationSummary()呈现的错误中显示html元素(如链接)_C#_Asp.net Mvc 3_Razor - Fatal编程技术网

C# 如何在通过html.ValidationSummary()呈现的错误中显示html元素(如链接)

C# 如何在通过html.ValidationSummary()呈现的错误中显示html元素(如链接),c#,asp.net-mvc-3,razor,C#,Asp.net Mvc 3,Razor,我的一条错误消息呈现了一个链接。但是,Html.ValidationSummary()对其进行编码,因此显示如下: 您指定的手机或电子邮件帐户已存在。 如果您忘记了密码,请删除它 相反,它应该呈现为: 您指定的手机或电子邮件帐户已存在。 如果您忘记了密码,请重新设置 错误将添加到ModelState内部视图中,如下所示: if (...) { ViewData.ModelState.AddModelError(string.Empty, string.Format("An account

我的一条错误消息呈现了一个链接。但是,
Html.ValidationSummary()
对其进行编码,因此显示如下:

您指定的手机或电子邮件帐户已存在。 如果您忘记了密码,请删除它

相反,它应该呈现为:

您指定的手机或电子邮件帐户已存在。 如果您忘记了密码,请重新设置

错误将添加到ModelState内部视图中,如下所示:

if (...)
{
    ViewData.ModelState.AddModelError(string.Empty, string.Format("An account with the mobile or email you have specified already exists. If you have forgotten your password, please {0} it.", Html.ActionLink("Reset", "Reset")));
}

简而言之,我应该如何防止
Html.validationsummary()
选择性地/完全地对错误中的Html进行编码。

当前用于显示错误消息的Html帮助程序不支持这一点。但是,您可以编写自己的HTML帮助程序来显示错误消息,而无需HTML转义,也就是说,它们会将错误消息视为原始HTML

首先,您可以使用Codeplex中的ASP.NET MVC源代码,特别是
ValidationExtensions
类的
ValidationSummary
方法:

    public static string ValidationSummary(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 (ModelState modelState in htmlHelper.ViewData.ModelState.Values) {
            foreach (ModelError modelError in modelState.Errors) {
                string errorText = GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext, modelError, null /* modelState */);
                if (!String.IsNullOrEmpty(errorText)) {
                    TagBuilder listItem = new TagBuilder("li");
                    listItem.SetInnerText(errorText);
                    htmlSummary.AppendLine(listItem.ToString(TagRenderMode.Normal));
                }
            }
        }

        unorderedList.InnerHtml = htmlSummary.ToString();

        return messageSpan + unorderedList.ToString(TagRenderMode.Normal);
    }
publicstaticstringvalidationsummary(此HtmlHelper HtmlHelper、字符串消息、IDictionary htmlAttributes){
//如果没有任何错误,则无需执行任何操作
if(htmlHelper.ViewData.ModelState.IsValid){
返回null;
}
字符串消息跨度;
如果(!String.IsNullOrEmpty(消息)){
标记生成器span标记=新标记生成器(“span”);
spanTag.MergeAttributes(HtmlatAttributes);
span tag.MergeAttribute(“类”,HtmlHelper.ValidationSummaryCssClassName);
spanTag.SetInnerText(消息);
messageSpan=spanTag.ToString(TagRenderMode.Normal)+Environment.NewLine;
}
否则{
messageSpan=null;
}
StringBuilder htmlSummary=新建StringBuilder();
标记生成器无序列表=新标记生成器(“ul”);
unorderedList.MergeAttributes(htmlAttributes);
unorderedList.MergeAttribute(“类”,HtmlHelper.ValidationSummaryCssClassName);
foreach(htmlHelper.ViewData.ModelState.Values中的ModelState ModelState){
foreach(modelState.Errors中的ModelError ModelError){
string errorText=GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext,modelError,null/*modelState*/);
如果(!String.IsNullOrEmpty(errorText)){
标记生成器列表项=新标记生成器(“li”);
listItem.SetInnerText(errorText);
htmlSummary.AppendLine(listItem.ToString(TagRenderMode.Normal));
}
}
}
unorderedList.InnerHtml=htmlSummary.ToString();
返回消息span+unorderedList.ToString(TagRenderMode.Normal);
}
然后可以更改此方法,将错误消息视为原始HTML

但有两个警告:

  • 您正在更改
    ModelState
    类的某些属性的含义。虽然您现在可以使用自己的HTML助手,但ASP.NET MVC的未来版本可能会引入不再适用于此方法的更改

  • 小心不要使用未正确转义的错误消息,以免您的web应用受到XSS攻击。某些标准验证注释可能不再工作,因为它们不会HTML转义错误消息

  • 可能重复的