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

能否在验证摘要中获取错误输入控件引用并实现锚点跳转?

实现带锚点跳转的验证摘要(自定义控件ID场景)

不用重构项目,通过模型属性名与自定义控件ID的映射就能实现需求,给你几个实用方案:

方案1:按规则自动转换ID

如果你的自定义控件ID是基于模型属性名有规律生成的(比如属性名转蛇形+后缀,如UserName→user_name_input),直接在验证摘要中动态生成锚点:

<div class="validation-summary-errors">
    <ul>
        @foreach (var kvp in ViewData.ModelState)
        {
            foreach (var error in kvp.Value.Errors)
            {
                // 把属性名转成自定义ID格式,示例:驼峰转蛇形加后缀
                var controlId = string.Join("_", kvp.Key.Select(c => char.IsUpper(c) ? $"_{char.ToLower(c)}" : c.ToString())).TrimStart('_') + "_input";
                <li><a href="#@controlId">@error.ErrorMessage</a></li>
            }
        }
    </ul>
</div>

方案2:静态字典映射无规律ID

如果自定义ID没有固定规则,提前在项目里维护一个属性名与ID的映射字典:

// 可以放在静态类里或者视图的代码块中
private static readonly Dictionary<string, string> PropertyToControlId = new()
{
    { nameof(YourModel.UserName), "custom_user_id_123" },
    { nameof(YourModel.Email), "email_input_custom" },
    // 其他属性映射
};

然后在验证摘要中使用这个字典生成锚点:

<div class="validation-summary-errors">
    <ul>
        @foreach (var kvp in ViewData.ModelState)
        {
            foreach (var error in kvp.Value.Errors)
            {
                if (PropertyToControlId.TryGetValue(kvp.Key, out var controlId))
                {
                    <li><a href="#@controlId">@error.ErrorMessage</a></li>
                }
                else
                {
                    <li>@error.ErrorMessage</li>
                }
            }
        }
    </ul>
</div>

方案3:生成控件时动态记录映射

如果不想硬编码字典,可以在生成输入控件的同时,把属性名和ID的映射存入ViewData:

@{
    // 初始化映射字典
    if (ViewData["ControlIdMap"] == null)
    {
        ViewData["ControlIdMap"] = new Dictionary<string, string>();
    }
    var controlIdMap = (Dictionary<string, string>)ViewData["ControlIdMap"];
}

// 生成自定义ID的输入控件
var userNameId = "my_custom_user_name";
controlIdMap.Add(nameof(YourModel.UserName), userNameId);
<input type="text" id="@userNameId" asp-for="UserName" />

// 其他输入控件同理

然后在验证摘要中读取这个映射:

@{
    var controlIdMap = ViewData["ControlIdMap"] as Dictionary<string, string> ?? new();
}
<div class="validation-summary-errors">
    <ul>
        @foreach (var kvp in ViewData.ModelState)
        {
            foreach (var error in kvp.Value.Errors)
            {
                if (controlIdMap.TryGetValue(kvp.Key, out var controlId))
                {
                    <li><a href="#@controlId">@error.ErrorMessage</a></li>
                }
                else
                {
                    <li>@error.ErrorMessage</li>
                }
            }
        }
    </ul>
</div>

这些方案都不需要重构核心逻辑,只需要在验证摘要的渲染环节,把模型属性名和自定义控件ID做关联即可实现点击错误项跳转到对应输入框的效果。

内容的提问来源于stack exchange,提问作者Fredou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:15:55