从 .NET Core 3 MVC 中的 ajax 调用将多个参数(复杂对象)传递到操作方法

Pass multiple parameters (complex objects) into action method from ajax call in .NET Core 3 MVC

下面是基本的例子structure/goal:

javascript ajax 结构:

helper = someBaseClass.extend({
    init: function () {
    },
    makeRequest: function (options) {
        return createAjaxObservable(
            {
                url: options.url,
                data: JSON.stringify(options.data), //stringify is present
                type: options.type,
                contentType: 'application/json; charset=utf-8',
                dataType: "json",
                cache: false
            });
    }
});

服务器javascript请求:

this.helper.makeRequest({ url: "/Session/RequestSomeInfo", type: "POST", data: { sessionId: options.sessionId, requestSomeInfo: { isActive: true } });

为所有活跃的任意实体请求一些关于 sessionId 的任意信息。 我在这里使用 post 进行测试。

控制器方法:

[HttpPost]
public JsonResult RequestSomeInfo(Session sessionId, RequestSomeInfo request)
{
    //implement api connection 
    //request some arbitary info on sessionid, for all arbitary entities that are active.
    
    return CreateJson(true, new { Data = requestSomeInfoResponse.Data });
}

以上是理想的解决方案。 我知道这可能是不可能的。 最好的替代解决方案是什么?

我省略了[FromBody]。 [FromBody] 我理解只会传递一个参数。我可以使用 [FromBody] 使上述通用结构起作用,但它只会传递一个参数。 我也尝试过使用一个包装器 class - 它包含 Session 和 RequestSomeInfo,然后传递这个包装器 class。这也有效。 然而,问题在于 RequestSomeInfo 可能会在广泛的 Web 应用程序中请求不同的东西。例如,RequestSomeInfo 可以是 RequestCustomerNames、RequestActivities、RequestSocialConnections 等。 --> 我要传递的对象可能会变得复杂。

我可以使用抽象或泛型来完成此任务。在包装器 class 上使用泛型是可行的,并且是迄今为止最好的解决方案,但是,这不是理想的解决方案。理想情况下,我想尽可能接近地实现上述基本目标和结构。

Ajax不能同时映射多个复杂类型,只能同时传递多个基本类型。更好的方法是创建一个 ViewModel 来引用这两个复杂类型。

由于你没有给出完整的ajax实现代码,我以jQuery的ajax为例。这里的Session是默认自定义的

这是所有模型。

public class Session
{
    public int sessionId { get; set; }
}
public class RequestSomeInfo
{
    public bool isActive { get; set; }
}
public class ViewModel
{
    public Session  Session { get; set; }
    public RequestSomeInfo RequestSomeInfo { get; set; }
}

Ajax代码如下(放在Index.cshtml)。

$(function () {
        $.ajax({
            url: '/Session/RequestSomeInfo',
            type: 'post',
            data: {
                session: {
                    sessionId: '123'
                },
                requestSomeInfo: { isActive: true }
            },
            success: function (data) {
                console.log(data)
            },
            error: function () {

            }
        })
    })

控制器改成这样

    [HttpPost]
    public JsonResult RequestSomeInfo(ViewModel viewModel)
    { 
        return Json(viewModel);
    }

你可以得到这个结果。