You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 08:02:54