为什么我的ASP.NET模型绑定不生效,控制器收不到视图表单提交的数据?
问题根因
视图中表单提交的字段名前缀为Network.(即实际提交的键是Network.SSID、Network.Password),但控制器Action接收的参数是NetworkSettings类型、参数名为model,ASP.NET Core默认模型绑定规则会优先匹配和参数名一致的前缀,二者不匹配所以字段绑定失败,值为null。
可行解决方案(任选其一即可)
方案1:修改Action参数名和前缀匹配
把控制器方法的参数名改为Network,和表单字段前缀保持一致:[HttpPost] [ValidateAntiForgeryToken] public IActionResult ChangeWiFiNetwork(Models.Settings.NetworkSettings Network) { // 注意日志写法要加占位符才能正确输出参数值 Logger.LogInformation("SSID:{Ssid}", Network.SSID); Logger.LogInformation("PASS:{Pass}", Network.Password); return RedirectToAction("Index"); }方案2:给参数加Bind特性指定前缀
不用改参数名,通过[Bind]特性显式指定绑定前缀为Network:[HttpPost] [ValidateAntiForgeryToken] public IActionResult ChangeWiFiNetwork([Bind(Prefix = "Network")] Models.Settings.NetworkSettings model) { Logger.LogInformation("SSID:{Ssid}", model.SSID); Logger.LogInformation("PASS:{Pass}", model.Password); return RedirectToAction("Index"); }方案3:Action直接接收上层Settings类参数
保持和视图绑定的模型完全一致,直接用Settings类作为接收参数:[HttpPost] [ValidateAntiForgeryToken] public IActionResult ChangeWiFiNetwork(Models.Settings.Settings model) { Logger.LogInformation("SSID:{Ssid}", model.Network.SSID); Logger.LogInformation("PASS:{Pass}", model.Network.Password); return RedirectToAction("Index"); }
补充提示
你当前的日志写法Logger.LogInformation("SSID:", model.SSID)没有使用占位符,即使模型绑定成功也不会正确输出SSID的值,参考上面示例修改为带占位符的写法即可。
内容的提问来源于stack exchange,提问作者Rasmus-123
相关产品推荐
相关产品推荐

