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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:53:52