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

使用Ajax BeginForm提交,控制器接收UsersDetails参数为null的问题

解决Ajax提交后UsersDetails参数为null的问题

问题原因

你的Razor视图绑定的是SettingViewModel,表单字段的name属性会自动生成为UsersDetails.username、UsersDetails.kullaniciAd这种带前缀的格式。而控制器接收的是UsersDetails类型参数,ASP.NET模型绑定器无法将带UsersDetails前缀的字段值映射到UsersDetails对象的属性上,导致参数为null。

解决方案

方案1:修改表单字段的name属性

在Html.TextBoxFor中手动指定name属性,去掉UsersDetails前缀,让字段名和UsersDetails的属性名直接匹配:

@model GAP_Bakim.ViewModel.SettingViewModel

@using (Ajax.BeginForm("Details", "Setting", new AjaxOptions { HttpMethod = "POST", OnSuccess = "detailSuccess", OnFailure = "detailFailure" }))
{
    @Html.AntiForgeryToken()

    <div class="input-box mb-3">
        <span>Kullanıcı Adı</span>
        @Html.TextBoxFor(m => m.UsersDetails.username, new { @class = "form-control details-inputs", id = "detailUsernameInput", required = "required", @readonly = "readonly", name = "username" })
    </div>

    <div class="input-box mb-3">
        <span>Ad</span>
        @Html.TextBoxFor(m => m.UsersDetails.kullaniciAd, new { @class = "form-control details-inputs", id = "detailNameInput", required = "required", maxlength = 25, pattern = "[A-Za-zğüşıöçĞÜŞİÖÇ\u0020]+", name = "kullaniciAd" })
    </div>
}

方案2:在控制器参数上添加绑定前缀特性

在控制器的UsersDetails参数上添加[Bind(Prefix = "UsersDetails")],告诉模型绑定器字段的前缀是UsersDetails,实现正确映射:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Details([Bind(Prefix = "UsersDetails")] UsersDetails users)
{
    // 业务逻辑处理
}

方案3:手动从请求中取值(不推荐)

如果前两种方法不适用,可手动从Request.Form中获取字段值并构造UsersDetails对象:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Details()
{
    var users = new UsersDetails
    {
        username = Request.Form["UsersDetails.username"],
        kullaniciAd = Request.Form["UsersDetails.kullaniciAd"]
    };
    // 业务逻辑处理
}

内容的提问来源于stack exchange,提问作者krautcez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 07:32:48