You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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:自定义验证特性(适合多字段复用)

如果多个字段都需要这种“字段旁*+摘要详细信息”的效果,可以自定义一个验证特性,分离两种提示文本:

  1. 创建自定义特性类:
public class RequiredWithAsteriskAttribute : RequiredAttribute
{
    // 字段旁显示的文本,默认是*
    public string FieldPrompt { get; set; } = "*";

    // 验证摘要显示的还是ErrorMessage
    public override string FormatErrorMessage(string name)
    {
        return base.FormatErrorMessage(name);
    }
}
  1. 在模型中使用该特性:
[RequiredWithAsterisk(ErrorMessage = "Phone is required."), 
 RegularExpression("^(1?(-?\\d{3})-?)?(\\d{3})(-?\\d{4})$", ErrorMessage = "Invalid format for phone.")]
public string Phone { get; set; }
  1. 视图中读取特性的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 13:55:00