使用 Ajax 向控制器发送 post 请求时模型与列表 <Model>
Model vs List<Model> when sending post request to controller using Ajax
我一直在尝试使用 ajax 将列表模型发送到控制器,但它似乎根本不起作用
型号
public string MyModel {
public string myfieldName {get;set;}
}
控制器
public JsonResult Create(List<myModel> list)
{
return Json("Success");
}
post请求
$("body").on("click", "#btnSave", function () {
var list= new Array();
list = [{ myfieldName: 'ABC' }, { myfieldName: 'DEF' }];
//Send the JSON array to Controller using AJAX.
$.ajax({
type: "POST",
url: "/Project/Create",
data: JSON.stringify({ list }),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (r) {
alert(r + " record(s) inserted.");
}
});
});
所以当我发送这个时,我检查浏览器,我可以看到请求负载是用 json 对象列表发送的
但是,当我转到控制器时,列表根本没有绑定它,所以我检查 http.context 以检查那里的请求有效负载,它都是空的。
另一方面,当我像下面这样更改控制器时
正在发送仅包含模型的请求
public JsonResult Create(myModel data)
{
return Json("Success");
}
并用以下
更改 js
$("body").on("click", "#btnSave", function () {
var data ={};
data.myfieldName= "test";
//Send the JSON array to Controller using AJAX.
$.ajax({
type: "POST",
url: "/Project/Create",
data: data,
success: function (r) {
alert(r + " record(s) inserted.");
}
});
});
这里唯一的区别是我不作为 json 发送,所以我的问题是发送模型与使用 ajax 的模型列表之间的区别是什么
我可以更改什么以使控制器绑定数据或接受模型数据列表
注意我正在使用 .Net 核心 2.0
谢谢
我通常使用这种方法将我的 Model
作为 List
发送到我的 Controller
方法。我将尝试向您展示您的场景,以及如何执行此操作:
AJAX:
$("body").on("click", "#btnSave", function () {
var list= new Array();
list = [{ myfieldName: 'ABC'}, { myfieldName: 'DEF'}];
//Send the JSON array to Controller using AJAX.
$.ajax({
type: "POST",
url: "@Url.Action("Create","Project")",
data:{"json": JSON.stringify(list)},
dataType: "json",
success: function (r) {
alert(r + " record(s) inserted.");
}
});
});
并且您可以在 Create
方法中像这样接收 Model
:
确保导入 System.Web.Script.Serialization
命名空间:
using System.Web.Script.Serialization
[HttpPost]
public JsonResult Create(string json)
{
var serializer = new JavaScriptSerializer();
dynamic jsondata = serializer.Deserialize(json, typeof(object));
List<string> myfieldName=new List<string>();
//Access your array now
foreach (var item in jsondata)
{
myfieldName.Add(item["myfieldName"]);
}
//Do something with the list here
return Json("Success");
}
希望对您有所帮助。
另一种方法是使用不显眼的 AJAX。您只需要从 Nuget 包管理器安装 Microsoft jQuery unobtrusive AJAX。
然后,在您看来,调用以下内容:
@{using (Ajax.BeginForm("Create", "ControllerName", null, new AjaxOptions()
{
HttpMethod = "POST",
// ...
}
}))
{
// Html code goes here
}
还要确保将其包含在视图底部:
<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
然后,您可以为您的控制器设置一个正常的 ActionResult(而不是 JsonResult)并接受 List 列表的参数。
我一直在尝试使用 ajax 将列表模型发送到控制器,但它似乎根本不起作用
型号
public string MyModel {
public string myfieldName {get;set;}
}
控制器
public JsonResult Create(List<myModel> list)
{
return Json("Success");
}
post请求
$("body").on("click", "#btnSave", function () {
var list= new Array();
list = [{ myfieldName: 'ABC' }, { myfieldName: 'DEF' }];
//Send the JSON array to Controller using AJAX.
$.ajax({
type: "POST",
url: "/Project/Create",
data: JSON.stringify({ list }),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (r) {
alert(r + " record(s) inserted.");
}
});
});
所以当我发送这个时,我检查浏览器,我可以看到请求负载是用 json 对象列表发送的 但是,当我转到控制器时,列表根本没有绑定它,所以我检查 http.context 以检查那里的请求有效负载,它都是空的。 另一方面,当我像下面这样更改控制器时
正在发送仅包含模型的请求
public JsonResult Create(myModel data)
{
return Json("Success");
}
并用以下
更改 js $("body").on("click", "#btnSave", function () {
var data ={};
data.myfieldName= "test";
//Send the JSON array to Controller using AJAX.
$.ajax({
type: "POST",
url: "/Project/Create",
data: data,
success: function (r) {
alert(r + " record(s) inserted.");
}
});
});
这里唯一的区别是我不作为 json 发送,所以我的问题是发送模型与使用 ajax 的模型列表之间的区别是什么 我可以更改什么以使控制器绑定数据或接受模型数据列表 注意我正在使用 .Net 核心 2.0
谢谢
我通常使用这种方法将我的 Model
作为 List
发送到我的 Controller
方法。我将尝试向您展示您的场景,以及如何执行此操作:
AJAX:
$("body").on("click", "#btnSave", function () {
var list= new Array();
list = [{ myfieldName: 'ABC'}, { myfieldName: 'DEF'}];
//Send the JSON array to Controller using AJAX.
$.ajax({
type: "POST",
url: "@Url.Action("Create","Project")",
data:{"json": JSON.stringify(list)},
dataType: "json",
success: function (r) {
alert(r + " record(s) inserted.");
}
});
});
并且您可以在 Create
方法中像这样接收 Model
:
确保导入 System.Web.Script.Serialization
命名空间:
using System.Web.Script.Serialization
[HttpPost]
public JsonResult Create(string json)
{
var serializer = new JavaScriptSerializer();
dynamic jsondata = serializer.Deserialize(json, typeof(object));
List<string> myfieldName=new List<string>();
//Access your array now
foreach (var item in jsondata)
{
myfieldName.Add(item["myfieldName"]);
}
//Do something with the list here
return Json("Success");
}
希望对您有所帮助。
另一种方法是使用不显眼的 AJAX。您只需要从 Nuget 包管理器安装 Microsoft jQuery unobtrusive AJAX。
然后,在您看来,调用以下内容:
@{using (Ajax.BeginForm("Create", "ControllerName", null, new AjaxOptions()
{
HttpMethod = "POST",
// ...
}
}))
{
// Html code goes here
}
还要确保将其包含在视图底部:
<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
然后,您可以为您的控制器设置一个正常的 ActionResult(而不是 JsonResult)并接受 List 列表的参数。