我有注册页面,如果验证失败,它会使用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>
<% } %>
答案 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());
});
});