ASP.NET Core 8.0 MVC中提交禁用控件值的脚本失效问题
解决ASP.NET Core 8.0 MVC中禁用表单控件无法提交值的问题
你的代码存在两个核心问题导致禁用控件的值无法正常提交:
问题1:脚本执行时机错误
脚本写在<form>标签之前,此时DOM还未完成渲染,$('form')无法找到对应的表单元素,导致提交事件绑定失败。
问题2:事件参数重名冲突
each循环里的参数e和外层submit事件的事件对象重名,会覆盖原始事件对象,可能导致后续逻辑异常。
修正方案1:调整脚本执行时机并修复参数冲突
把脚本移到@section Scripts中(确保jQuery已加载),同时修改循环参数名,还可以精准定位需要启用的控件,避免影响其他禁用元素:
@model Profession <form method="post"> <div class="border p-3 mt-4 row"> <div class="row pb-2"> <h2 class="text-primary">MODIFIER UNE PROFESSION</h2> <hr /> </div> <div class="mb-3 row p-1" style="width: 15em;"> <label asp-for="NoProfession"> </label> <input asp-for="NoProfession" class="form-control" disabled /> </div> <br /> <div class="mb-3 row p-1"> <label asp-for="NomProfession"> </label> <input asp-for="NomProfession" class="form-control" /> <span asp-validation-for="NomProfession" class="text-bg-danger"> </span> </div> <br /> <div class="mb-3 row p-1"> <label asp-for="Inactif"> </label> <input asp-for="Inactif" class="form-check-input" type="checkbox"> </div> <br /> <div class="mb-3 row p-1"> <label asp-for="RemProfession"> </label> <textarea asp-for="RemProfession" class="form-control" rows="5"></textarea> </div> <div class="row"> <div class="col-6 col-md-3"> <button type="submit" class="btn btn-primary form-control">Modifier</button> </div> <div class="col-6 col-md-3"> <a asp-controller="Administrateur" asp-action="Professions" class="btn btn-secondary border form-control"> Retour à la liste des professions </a> </div> </div> </div> </form> @section Scripts { @* ********** 启用前端验证 ********** *@ <partial name="_ValidationScriptsPartial" /> @* ********** 提交时启用指定禁用字段 ********** *@ <script type="text/javascript"> $('form').submit(function(e) { // 避免参数重名,改用其他变量名 $(':disabled[name="NoProfession"]').each(function() { $(this).removeAttr('disabled'); }); }); </script> }
修正方案2:使用隐藏字段替代禁用控件(更可靠)
如果不想依赖JavaScript,推荐添加一个隐藏字段保存NoProfession的值,这样即使输入框禁用,隐藏字段也会自动提交值,兼容性更好:
<div class="mb-3 row p-1" style="width: 15em;"> <label asp-for="NoProfession"> </label> <input asp-for="NoProfession" class="form-control" disabled /> <!-- 添加隐藏字段同步值 --> <input type="hidden" asp-for="NoProfession" /> </div>
内容的提问来源于stack exchange,提问作者Patrice
相关产品推荐
相关产品推荐

