使用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
相关产品推荐
相关产品推荐

