.NET Core 2中Ajax传递参数至Action失败问题求助
问题分析与解决:Action无法接收POST传递的参数
你遇到的核心问题是在同一个Action方法里多次使用了[FromBody]特性——.NET Core的模型绑定规则明确规定:一个Action中只能有一个参数标记[FromBody]。因为[FromBody]会尝试把整个请求体的JSON内容绑定到对应的参数上,它没办法拆分请求体里的JSON数据分别赋值给两个不同的[FromBody]参数,所以你的tableName和code自然都拿不到值。
下面给你两种可行的解决办法:
方法一:创建ViewModel封装参数(推荐)
这是最符合.NET Core开发规范的做法,把需要传递的参数封装成一个类:
// 新建一个ViewModel类,命名可以根据业务调整 public class TableDetailRequest { public string TableName { get; set; } public string Code { get; set; } }
然后修改你的Action方法,用这个ViewModel接收参数:
[HttpPost] public IActionResult Detail([FromBody] TableDetailRequest request) { // 现在可以正常获取参数了 var row = tableBLL.GetAllByCode(request.TableName, request.Code); // 记得把查询到的row传给局部视图,不然视图里没有数据可展示 return PartialView("~/Views/Table/Detail.cshtml", row); }
前端的AJAX代码不用改,你的JSON.stringify写法是正确的,这样就能把请求体的JSON数据完整绑定到TableDetailRequest对象上。
方法二:改用表单数据传递参数(无需新建类)
如果你不想额外创建ViewModel,可以把参数作为表单数据发送,同时去掉[FromBody]特性:
首先修改前端AJAX的data和contentType:
$.ajax({ method: "POST", url: "/Table/Detail", // 直接传普通对象,不用JSON.stringify data: { tableName: "IN_COMAGREE", code: "1" }, // 去掉contentType,或者设置为application/x-www-form-urlencoded(默认就是这个) // contentType: "application/json", success: function (response) { $('#dialog').html(response); $('#dialog').dialog('open'); }, // 其他回调函数不变 });
然后修改Action方法:
[HttpPost] public IActionResult Detail(string tableName, string code) { var row = tableBLL.GetAllByCode(tableName, code); return PartialView("~/Views/Table/Detail.cshtml", row); }
这种方式适合简单场景,但参数多了之后不如ViewModel清晰。
额外提醒:局部视图的数据绑定
你的局部视图目前没有接收模型数据,即使Action拿到了参数并查询到了row,视图里也没法展示数据。记得在局部视图顶部加上模型声明,然后绑定数据到输入框:
@model YourProjectNamespace.YourRowModel <!-- 替换成你实际的模型类型 --> <form asp-action="" class="smart-form"> <header> Name table </header> <fieldset> <section> <label class="label">Cod</label> <label class="input"> <input type="text" class="input-xs" value="@Model.Code"> </label> </section> <section> <label class="label">Descr</label> <label class="input"> <input type="text" class="input-xs" value="@Model.Description"> </label> </section> </fieldset> </form>
内容的提问来源于stack exchange,提问作者Cicciux
相关产品推荐
相关产品推荐

