【问题标题】:MVC Send list through AJAXMVC 通过 AJAX 发送列表
【发布时间】:2013-09-19 09:07:28
【问题描述】:

好的,我已经看到很多关于这个问题的问题,但没有一个答案对我真正有用,这是我的 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);
}

jsonFilters 始终保持为空...我也尝试将 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; }
    }

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

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

设置“traditional: true”、设置“contentType”、使用 JSON.stringify 并尝试在 MVC 控制器中接受字符串(不可行)

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

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

【问题讨论】:

    标签: c# jquery ajax asp.net-mvc


    【解决方案1】:

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

    List<FilterSessionModel>
    

    很确定上述方法行不通,我会尝试类似 Object.

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

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

    **由于更多信息而更新。添加错误部分并在控制器返回时查看这些变量,同时启动 fiddler 并观察你得到的 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.
        }
    });
    

    【讨论】:

    • 感谢您的回答,不幸的是,这也不起作用;除此之外,您实际上可以在 MVC 控制器中使用自定义类作为参数。 MVC 自动映射这些。除此之外,我要确保我传递的是有效数据 - 与上面显示的相同。
    • 如果您看到数据为空,显然您正在访问您的控制器。我会尝试只传递一个字符串,一个简单的字符串,看看它是否通过了,如果是,那么你的 ajax 调用肯定有问题,我会在上面添加一些内容。
    • 有趣的是,如果我传递一个字符串,控制器仍然没有收到它。 (我没有忘记修改控制器来接收字符串)......这真的很奇怪
    • 是的,您正在缩小范围。我会添加那个错误处理程序,并且在 ajax 帖子和获取 fiddler 上是你最好的朋友。
    【解决方案2】:

    javascript 或 ajax 调用永远不会对对象进行类型转换。 . .您需要将控制器端参数的类型设置为字符串或列表,否则您还可以设置对象类型。 .如果您以这种方式修改代码......您的代码肯定可以工作!!!

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        首先我假设您的$.ajax 是为JQuery 而不是其他一些Javascript 框架。如有错误请指正。

        ASP.NET MVC 实际上可以执行您的要求(将通过 AJAX 发送到 List&lt;FilterSessionModel&gt; 的数据解析,但通过 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);
        }
        

        【讨论】:

        • 感谢您的回答 - 您对 AJAX 的假设确实是正确的,我使用的是 MVC 3。它不起作用的原因是因为我发送的对象是一个“匿名”数组,它需要包装在定义参数名称的对象中(我的问题已更新以显示解决方案)。发送的数据不是未定义的,只是“未标记”,因此控制器没有将其映射到参数。
        【解决方案5】:
        $.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
            }
        });
        

        【讨论】:

        • 请为代码添加一些上下文/解释,因为这样更容易理解。
        猜你喜欢
        • 1970-01-01
        • 2016-11-25
        • 2018-11-09
        • 1970-01-01
        • 2015-11-21
        • 2021-01-05
        • 1970-01-01
        • 1970-01-01
        • 2013-09-06
        相关资源
        最近更新 更多