ASP.NET Core动态表单中无法正确设置span的asp-validation-for属性
解决ASP.NET Core动态输入框的验证提示绑定问题
问题出在asp-validation-for标签助手的工作机制上:它接受的是模型属性表达式,而非直接的字符串变量。当你写asp-validation-for="@Model.NameofContentInput"时,标签助手会将其解析为模型的属性名NameofContentInput,而不是读取该变量存储的动态值,所以最终生成的data-valmsg-for属性值不符合预期。
直接解决方案:手动设置验证属性
不需要依赖asp-validation-for标签助手,直接给<span>设置data-valmsg-for和data-valmsg-replace属性——这两个属性就是asp-validation-for最终生成的核心属性:
修改后的代码片段:
@model AnswerViewModel <fieldset class="row answerrow" style="margin: 20px;" id="@Model.answer.Id"> <div class="form-group"> <input type="hidden" asp-for="@Model.answer.Id" name="@Model.NameofAnswerIdInput" value="@Model.answer.Id"></input> <input type="hidden" asp-for="@Model.answer.QuestionId" name="@Model.NameofQuestionIdInput" value="@Model.answer.QuestionId" /> <div id="@Model.answer.Id" class="d-flex form-group"> <input required="true" asp-for="@Model.CorrectAnswerId" name="@Model.NameofCorrectAnswerIdRadio" type="radio" value="@Model.answer.Id" /> <!-- 手动设置验证关联属性 --> <span data-valmsg-for="@Model.NameofCorrectAnswerIdRadio" data-valmsg-replace="true" class="text-danger"></span> <input id="@Model.answer.Id" required="true" asp-for="@Model.answer.Content" name="@Model.NameofContentInput" value="@Model.answer.Content" class="form-control ms-2" /> <!-- 手动设置验证关联属性 --> <span data-valmsg-for="@Model.NameofContentInput" data-valmsg-replace="true" class="text-danger"></span> </div> </div> </fieldset>
原理说明
data-valmsg-for:指定该提示框关联的输入框name值,必须和对应input的name完全匹配data-valmsg-replace="true":表示用验证提示替换span的原有内容,这是asp-validation-for默认的行为
这样修改后,span的data-valmsg-for就会正确设置为@Model.NameofContentInput和@Model.NameofCorrectAnswerIdRadio对应的动态值,客户端验证就能正常关联到对应的输入框。
内容的提问来源于stack exchange,提问作者Mətin Abaszadə
相关产品推荐
相关产品推荐

