从 .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);
}
你可以得到这个结果。
下面是基本的例子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);
}
你可以得到这个结果。