能否在验证摘要中获取错误输入控件引用并实现锚点跳转?
实现带锚点跳转的验证摘要(自定义控件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
相关产品推荐
相关产品推荐

