首页 > 解决方案 > Asp.Net MVC ValidationSummary HTML 错误信息

问题描述

当注册的电子邮件地址已被使用时,我被要求在错误消息中包含一个链接。

此属性的验证通过模型上的 IValidatableObject.Validate 函数完成。我的验证功能看起来像这样......

Public Overridable Function Validate(validationContext As ValidationContext) As IEnumerable(Of ValidationResult) Implements IValidatableObject.Validate
    Dim results = New List(Of ValidationResult)()

    ....

    If Not EmailAvailable(Email) Then
        results.Add(New ValidationResult("The email address is not available. <a href=""/forgot_password"">Forgot Password?</a>", {"Email"}))
    End If
    Return results
End Function

在我看来,我正在使用自定义的“MyValidationSummary”扩展函数来很好地格式化错误。

扩展功能这样做...

....

Dim ul = New TagBuilder("ul")
For Each key In helper.ViewData.ModelState.Keys
    For Each e In helper.ViewData.ModelState(key).Errors
        Dim li = New TagBuilder("li") With {
            .InnerHtml = helper.Encode(e.ErrorMessage)
        }
        ul.InnerHtml += li.ToString()
    Next
 Next
 container.InnerHtml += ul.ToString()
 Return New MvcHtmlString(container.ToString())

我知道我可以删除 helper.Encode,然后将消息作为原始 html 输出,但这感觉有点 hacky。

我正在尝试找到一种能够在消息中选择性地包含 html 的好方法,同时仍保留编码纯文本消息的默认行为。

我想做的是创建一个自定义的 ValidationResult 类,它可以选择包含一个 HTMLString 属性,这样如果我选择,我可以在消息中包含 HTML。

我可以这样做,但我不知道是否有任何方法可以从 MyValidationSummary 获取此自定义 ValidationResult。

更新:目前,我刚刚在错误消息中添加了一个占位符标记,然后我将其替换为 MyValidationSummary 扩展方法中的实际链接。它非常hacky,但在我找到更好的方法之前它会起作用。

标签: asp.net-mvc-5

解决方案


推荐阅读