ASP.NET MVC页面 - HTML.ValidationSummary中的超链接

时间:2010-04-26 23:55:49

标签: asp.net-mvc asp.net-mvc-2

我有注册页面,如果验证失败,它会使用HTML.ValidationSummary控件显示错误消息。

现在我必须在验证错误消息中显示超链接。但它也将href视为字符串。

我尝试使用超链接显示的验证消息是:**"User already exists in the system, please <a href='../Login.aspx'>login</a>"**

感谢您的回复。

这是我的代码:

<% using (Html.BeginForm()) {%>
    <%= Html.ValidationSummary(false) %>
    <fieldset>
    <div class="cssform">;
        <p>
            <%= Html.LabelFor(model => model.email)%><em>*</em>
            <%= Html.TextBoxFor(model => model.email, new { @class = "required email" })%>
            <%= Html.ValidationMessageFor(model => model.email)%>
        </p>
        <p>
            <%= Html.Label("Confirm email")%><em>*</em>
            <%= Html.TextBox("confirm_email")%>
            <%= Html.ValidationMessage("confirm_email") %>
        </p>
        <p>
            <%= Html.Label("Password")%><em>*</em>
            <%= Html.Password("Password", null, new { @class = "required" })%>
            <%= Html.ValidationMessage("Password")%><br />
            (Note: Password should be minimum 6 characters)
        </p>
        <p>
            <%= Html.Label("Confirm Password")%><em>*</em>
            <%= Html.Password("confirm_password")%>
            <%= Html.ValidationMessage("confirm_password") %>
        </p><hr />
    </div>
    <p><input type="submit" value="Register" /></p>
    </fieldset>
<% } %>

2 个答案:

答案 0 :(得分:3)

默认的ValidationSummary助手返回HTML编码值;如果您想在ValidationSummary中允许HTML,则需要创建自己的版本。请查看MVC 2 RTM source code中的源代码以开始使用。 ValidationSummary HtmlHelper在System.Web.Mvc.Html.ValidationExtensions类中定义(位于mvc2-rtm-sources \ src \ SystemWebMvc \ Mvc \ Html中)。

看一下ValidationExtensions.cs中的源代码,看来listItem.SetInnerText(errorText)是罪魁祸首:

if (modelStates != null) {
    foreach (ModelState modelState in modelStates) {
        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));
            }
        }
    }
}

将代码更改为listItem.InnerHtml = errorText会产生您想要的行为;但是,它不会那么简单,因为ValidationSummary方法会调用一些内部的System.Web.Mvc方法,您必须在自定义版本中手动实现这些方法才能重现原始行为。

答案 1 :(得分:3)

服务器端解决方案更好,但在客户端,我们可以运行快速技巧:

$(function(){
    $(".validation-summary-errors").find("li").each(function () {
        var $this = $(this);
        $this.html($this.text());
    });
});