ASP.NET MVC中DropDownListFor提交表单选中值始终返回0如何解决
问题排查与解决方法
1. 检查下拉选项值绑定是否正确
首先确认Category类的主键属性名是否和SelectList中指定的value字段一致:
如果你的Category类主键不是Id,而是CategoryId之类的其他名称,需要修改DropDownListFor中SelectList的参数:
// 把第二个参数改成你Category类实际的主键字段名 @Html.DropDownListFor(model => model.SelectedId,new SelectList(Model.Categories,"实际主键名","CategoryName"),"Select Category", new { @class = "form-control" } )
你可以打开浏览器F12开发者工具,查看生成的<select>节点下的<option>的value属性是否为正确的分类ID,如果所有value为空,就属于字段名不匹配的问题。
2. 排查美化插件的数值同步问题
你用到了nice-select下拉美化插件,这类插件通常会隐藏原生<select>元素,用自定义DOM模拟下拉效果,若插件没有自动把选中值同步回原生<select>,就会导致提交时始终拿到默认值0。
你可以先移除<div>上的nice-select single-select类,用原生下拉框测试提交,如果能拿到正确值,就属于插件同步问题,添加以下JS代码手动同步值即可:
$('.nice-select').on('change', function() { $('#SelectedId').val($(this).val()); });
3. 检查表单提交的实际参数
打开浏览器F12的「网络」面板,点击提交按钮后查看ProductSave请求的表单数据:
- 如果请求里的
SelectedId值正确,但后端拿到的是0,检查是否有全局过滤器、自定义模型绑定器修改了该属性的值 - 如果请求里的
SelectedId值为0,检查页面是否存在多个同名的SelectedId字段(比如隐藏的input),优先级更高的字段把值覆盖了 - 如果请求里没有
SelectedId字段,回到前两步排查前端绑定问题
内容的提问来源于stack exchange,提问作者Sonu
相关产品推荐
相关产品推荐

