MVC 通过 AJAX 发送列表

本文关键字:列表 AJAX 通过 MVC | 更新日期: 2023-09-27 18:31:16

好的,我已经看到了大量关于这个问题的问题,但没有一个答案实际上对我有用,这是我的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<FilterSessionModel> jsonFilters)
{
    //Do things
    return Json(false, JsonRequestBehavior.AllowGet);
}

json过滤器始终保持空...我还尝试将contentType: "application/json; charset=utf-8"添加到 AJAX 调用中...但这并没有真正做任何事情

最后,类FilterSessionModel的结构如下:

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

关于我可能错过什么或可能会发生什么的任何想法?

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

设置"

传统:true",设置"contentType",使用 JSON.stringify 并尝试在 MVC 控制器中接受字符串(不行)

更新:多亏了下面的答案,我意识到缺少的是使用参数 ID 发送数据,如下所示:

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

MVC 通过 AJAX 发送列表

我会尝试在您的操作中切换类型。

List<FilterSessionModel>

很确定上述内容不起作用,我会尝试类似 Object 的东西。

或者可能是一个字符串,然后我会使用 newton json dll 推送到您的类列表中。

问题归结为你的操作无法找出类型,假设你在调用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.
    }
});

我想你正在寻找的东西在这里得到了回答:

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

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

ASP.NET MVC实际上可以做你要求它做的事情(解析通过AJAX发送到List<FilterSessionModel>的数据,但它似乎很难通过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]
public ActionResult GetFilterSession(List<FilterSessionModel> jsonFilters)
{
    //Do things
    return Json(false, JsonRequestBehavior.AllowGet);
}

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

$.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
    }
});