如何在Razor Pages中区分ErrorMessage与字段旁显示的错误文本?
在Razor Pages中实现字段旁显示*、验证摘要显示详细错误的验证效果
我有Web Forms开发背景,正在学习Razor Pages。之前在Web Forms里,常用asp:Validation控件分别设置验证摘要的详细错误信息,以及字段旁的简短提示(比如*),避免长消息打乱字段排版,示例代码如下:
<asp:TextBox ID="txtTitle" runat="server" /> <asp:RequiredFieldValidator ID="rfbTitleRequired" runat="server" ErrorMessage="Title is required." Text="*" ControlToValidate="txtTitle" Display="Static" />
现在用Razor Pages的DataAnnotations做字段验证时,发现字段旁和验证摘要都会显示完整的错误信息。我希望字段旁仅在验证失败时动态显示*,验证摘要则显示详细错误内容,想知道Razor Pages有没有类似Web Forms的内置实现方式,不用写大量额外代码?
当前我的Razor Pages代码如下:
cshtml视图代码
<div> <label asp-for="Phone">Phone:</label> <input asp-for="Phone" /> <span asp-validation-for="Phone" class="text-danger"></span> </div> <div asp-validation-summary="All" class="text-danger">Please correct the following errors:</div>
数据模型代码
[Required(ErrorMessage = "Phone is required."), RegularExpression("^(1?(-?\\d{3})-?)?(\\d{3})(-?\\d{4})$", ErrorMessage = "Invalid format for phone.")] public string Phone { get; set; }
解决方案:两种内置思路实现需求
方法1:直接通过模型状态判断渲染*(最简单)
不需要修改模型,只调整视图代码即可。核心是放弃用asp-validation-for输出错误文本,改为手动判断模型状态,验证失败时显示*,同时保留asp-validation-summary显示详细错误:
<div> <label asp-for="Phone">Phone:</label> <input asp-for="Phone" /> @if (!ModelState.IsValid && ModelState.ContainsKey(nameof(Phone)) && ModelState[nameof(Phone)].Errors.Any()) { <span class="text-danger">*</span> } </div> <div asp-validation-summary="All" class="text-danger">Please correct the following errors:</div>
这样字段旁只会在验证失败时显示*,而验证摘要依然会读取DataAnnotations中定义的ErrorMessage,显示完整的错误描述。
方法2:自定义验证特性(适合多字段复用)
如果多个字段都需要这种“字段旁*+摘要详细信息”的效果,可以自定义一个验证特性,分离两种提示文本:
- 创建自定义特性类:
public class RequiredWithAsteriskAttribute : RequiredAttribute { // 字段旁显示的文本,默认是* public string FieldPrompt { get; set; } = "*"; // 验证摘要显示的还是ErrorMessage public override string FormatErrorMessage(string name) { return base.FormatErrorMessage(name); } }
- 在模型中使用该特性:
[RequiredWithAsterisk(ErrorMessage = "Phone is required."), RegularExpression("^(1?(-?\\d{3})-?)?(\\d{3})(-?\\d{4})$", ErrorMessage = "Invalid format for phone.")] public string Phone { get; set; }
- 视图中读取特性的
FieldPrompt来显示:
<div> <label asp-for="Phone">Phone:</label> <input asp-for="Phone" /> @{ var phoneProp = typeof(YourModelType).GetProperty(nameof(YourModelType.Phone)); var attr = phoneProp.GetCustomAttribute<RequiredWithAsteriskAttribute>(); } @if (!ModelState.IsValid && ModelState[nameof(YourModelType.Phone)].Errors.Any()) { <span class="text-danger">@attr?.FieldPrompt ?? "*"</span> } </div> <div asp-validation-summary="All" class="text-danger">Please correct the following errors:</div>
这种方式更灵活,适合大量字段统一配置的场景。
内容的提问来源于stack exchange,提问作者yougotiger
相关产品推荐
相关产品推荐

