MVC通过AJAX发送列表

好的,我已经看到关于这个问题的大量问题,但是没有一个答案对我有用,这是我的AJAX:

$.ajax({ url: "/FilterSessions/GetFilterSession", type: "GET", dataType: "json", data: jsonFilters, traditional: true, success: function (response) { //Haha, it's never entering here. not really. } }); 

var“jsonFilters”包含一个包含以下数据的数组:

 [0] = { Path: "Test", Name: "More testing", Value: "Test Value" }, [1] = { Path: "Test", Name: "More testing", Value: "Test Value" } 

这是我的控制器:

 public ActionResult GetFilterSession(List jsonFilters) { //Do things return Json(false, JsonRequestBehavior.AllowGet); } 

jsonFilters总是保持为null …我也试过在AJAX调用中添加contentType: "application/json; charset=utf-8" ……但是这并没有真正做任何事情

最后, FilterSessionModel类的结构如下:

  public class FilterSessionModel { public string Path { get; set; } public string Name { get; set; } public string Value { get; set; } } 

关于我可能缺少什么或可能发生什么的任何想法?

到目前为止我尝试过的事情:

设置“traditional:true”,设置“contentType”,使用JSON.stringify并尝试接受MVC控制器中的字符串(禁止)

更新:感谢下面的回答,我意识到缺少的是使用param Id发送数据,如下所示:

  data: "{param1ID:"+ param1Val+"}" 

我想你在寻找的是这里得到的回答:

使用jQuery Ajax将对象列表传递到MVC控制器方法

我会尝试切换你的动作类型。

 List 

非常肯定以上不会起作用,我会尝试像Object这样的东西。

或者可能是一个字符串,然后我会使用newton json dll进入你的List of Class。

假设您在调用ajax之前检查数据,问题归结为您的操作无法确定类型。

**由于更多信息更新。 添加错误部分并查看从控制器返回的那些变量,同时启动提琴手并观察您获取的http号码。

 $.ajax({ type: "POST", url: "Servicename.asmx/DoSomeCalculation", data: "{param1ID:"+ param1Val+"}", contentType: "application/json; charset=utf-8", dataType: "json", success: function(msg) { UseReturnedData(msg.d); }, error: function(x, t, m, b) { //Look at the vars above to see what is in them. } }); 

javascript或ajax调用从不键入强制转换对象。 。 。你需要设置控制器端参数的类型字符串或列表否则你也可以设置对象类型。 。 如果你以这种方式修改了代码.. ..你的代码绝对有效!!!

首先,我假设您的$.ajax是针对JQuery而不是其他一些Javascript框架。 如果那是错的,请纠正我。

ASP.NET MVC实际上可以按照您的要求执行操作(将通过AJAX发送的数据解析为List ,但似乎很难通过GET请求执行此操作。这将有助于了解哪个版本的ASP您正在使用的.NET MVC,因为需要更多版本来使用旧版本。但是,我建议的应该适用于MVC 3或4。

当您使用GET请求通过JQuery发送AJAX并将其传递给JavaScript数组时,这就是您要发送到服务器的内容:

 http://localhost:50195/FilterSessions/GetFilterSession?undefined=&undefined= 

难怪模型为空,因为实际上没有数据被发送。

我相信ASP.NET可以接受像这样的对象(甚至是对象数组),但它不会这样做,格式化为JSON(如通过JSON.stringify),因为它只会产生以下请求:

 http://localhost:50195/FilterSessions/GetFilterSession?[{%22Path%22:%22Test%22,%22Name%22:%22TestName%22,%22Value%22:%22Testing%22},{%22Path%22:%22Test%22,%22Name%22:%22TestName%22,%22Value%22:%22Testing%22}] 

您可能希望这样做的方式是使用POST请求。 ASP.NET MVC实际上会接受一个JSON字符串作为POST数据,并将对其进行解码并正确解析模型。 您的AJAX代码可以通过几个修改正常工作:

 $.ajax({ url: "/FilterSessions/GetFilterSession", type: "POST", //Changed to POST dataType: "json", data: JSON.stringify(jsonFilters), //Pack data in a JSON package. contentType: "application/json; charset=utf-8", //Added so ASP recognized JSON traditional: true, success: function (response) { alert('Success!'); } }); 

您发布的控制器应该已经识别POST数据,但如果没有, [HttpPost]需要一个简单的[HttpPost]属性:

 [HttpPost] public ActionResult GetFilterSession(List jsonFilters) { //Do things return Json(false, JsonRequestBehavior.AllowGet); } 
 $.ajax({ url: "/FilterSessions/GetFilterSession", type: "GET", dataType: "json", data:JSON.stringify({ 'jsonFilters': jsonFilters}), contentType: 'application/json; charset=utf-8', success: function (response) { //Do your action } });