当注册的电子邮件地址已被使用时,我被要求在错误消息中包含一个链接。
此属性的验证是使用模型上的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,但它会一直有效,直到我找到了更好的方法。