ASP.NET MVC视图传值至控制器始终为NULL问题求助
我来帮你排查下这个问题,我之前也遇到过类似的情况,大概率是这几个细节没处理好导致的:
1. 先确认Ajax.BeginForm的依赖脚本是否正确引入
Ajax.BeginForm本质是靠jquery.unobtrusive-ajax.js来实现异步提交逻辑的,如果没引入这个脚本,它会退化成普通的表单提交,很容易出现参数丢失的情况。你需要在视图或者布局页里加上这个脚本引用:
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
注意路径要对应你项目里脚本的实际存放位置。
2. 表单控件必须放在form标签内部,且保证name属性匹配
你现在的TextBoxFor是写在Ajax.BeginForm外面的,用户输入的内容根本不会被表单提交到控制器;而你用的隐藏域,只会保存页面初始化时的Model.SearchThingy值,用户修改文本框后它不会自动更新,自然传过去的要么是旧值要么是空。
正确的做法是把文本框放到form标签内部,这样表单提交时会自动收集它的值:
@using (Ajax.BeginForm("SearchTest", "Search", null, new AjaxOptions { HttpMethod = "POST", OnBegin = "showGeneralLoadingIndicator", OnComplete = "hideGeneralLoadingIndicator" }, new { @id = "frmSearchOutstandingActions" })) { @Html.TextBoxFor(model => model.SearchThingy, new { @class = "form-control", @id = "txtSearchTerm" }) <button type="submit">执行搜索</button> }
MVC的模型绑定是大小写不敏感的,文本框生成的name属性是SearchThingy,刚好能对应控制器的searchThingy参数。
3. 改用视图模型接收参数更可靠
如果还是出现参数为null的情况,建议直接用你的SearchTestViewModel作为控制器的参数,模型绑定会更稳定:
[HttpPost] public PartialViewResult SearchTest(SearchTestViewModel model) { try { var vm = new SearchTestViewModel(model.SearchThingy); return PartialView("_SearchTest", vm); } catch { return PartialView("_Error"); } }
这种方式不需要纠结单个参数的名称匹配,只要表单控件的name和视图模型的属性名一致,就能自动映射。
4. 查询字符串方式的注意点
你之前尝试的查询字符串传值,要注意:当HttpMethod设为POST时,路由参数会被转换成表单的隐藏域,而不是URL上的查询字符串。如果想用GET方式传查询字符串,需要修改HttpMethod为"GET",同时确保路由参数名正确,但这种方式没法同步用户修改后的文本框值,还是把控件放form里更合理。
内容的提问来源于stack exchange,提问作者Chris

