【问题标题】:Jquery Ajax and asp.net mvc controllerJquery Ajax 和 asp.net mvc 控制器
【发布时间】:2014-08-28 01:38:58
【问题描述】:

我在使用 $.post() 和我的 mvc 控制器时遇到了一些问题。

我在网上尝试了几个例子,堆栈溢出是这样的:How can I post an array of string to ASP.NET MVC Controller without a form?

但没有成功。我只是想将一个字符串数组传递给我的控制器:

[HttpPost]
        public HttpResponseMessage Post([FromBody]List<string> idList, string request, bool auto)
        {
            LogHelper.Log(Severity.Info, "Just entered in POST api/files");

            var fileList = new List<string>();

            switch (request)
            {
                case "Activate":
                    fileList = auto ? _bendingsServies.GetBendigsToCome() : idList;
                    _filesServices.Activate(fileList);
                    break;
                case "Archive":
                    fileList = auto ? _filesServices.GetFilesToArchive() : idList;
                    _filesServices.Archive(fileList);
                    break;
                default:
                    return ControllerContext.Request.CreateResponse(HttpStatusCode.BadRequest);
                    break;
            }
            return ControllerContext.Request.CreateResponse(HttpStatusCode.OK);
        }

和我的jQuery:

@using System.Configuration
var api_url = "@ConfigurationManager.AppSettings["apiUrl"]";
$(document).ready(function() {
    // ---- Ajax calls ---- //
     $("#archivebutton").click(function() {
         var url = api_url + "Files?request=Archive&auto=false";
         var fileList = ["10", "14", "12"];
         var postData = { idList: fileList }
         $.post(url, $.param(postData,true));
     });
});

在我尝试过的所有内容中,idList 在我尝试时总是包含 0 个元素。

// ---- 编辑 ---- //

如果我将数据封装在 json 对象中,我可以发送数据:

   $("#activatebutton").click(function() {
                var url = api_url + "Files?request=Activate&auto=false";
                var fileList = ["this", "is", "a", "test"];
                $.post(url, { fileList: fileList});
            });

这是请求:

【问题讨论】:

  • 如果你直接传递fileList而不将它包装在postData中会发生什么? $.post(url, $.param(fileList, true));
  • 尝试不为“shallow”集合指定traditional。只需$.param(postData)
  • 不……在另一边仍然什么都没有。

标签: jquery ajax asp.net-mvc api rest


【解决方案1】:

您已经将$.param 包裹在整个对象周围,最终只是在模型绑定器执行其操作时发送了一个不匹配任何内容的字符串。你应该这样做了:

var postData = { idList: fileList };
$.post(url, postData);

您还应该向$.post 添加回调,如果没有其他原因,只是在流程正确完成后通知用户。

编辑

抱歉,我并没有真正考虑过,但在这种情况下您根本不应该使用$.param。只需将完整的对象传递给$.post

【讨论】:

  • 根据我的编辑,在回答和搞砸之前,我没有仔细考虑。你不应该使用$.param。没有理由这样做。您是否尝试过像我更正的答案所示的那样简单地提交整个对象?
  • 好吧,那么你还有其他问题在起作用。那应该行得通。使用浏览器中的开发者控制台检查发出的请求,并在您的问题中发布所有相关详细信息:请求的 URL、发送的有效负载等。
  • 好吧,我有了一些发现。您可以检查我的编辑内容类型不是 json。我想知道这是否是问题......
  • 未定义的爵士乐是当您尝试在数组上调用 $.params 时得到的结果(它需要具有名称-值对的东西)。将整个对象传递给$.params,无需任何调用,然后再次发布您的请求信息。
  • 还是一样的。您还可以看到我尝试使用 $.ajax 功能。困扰我的一件事是请求中的这个:Content-Type:application/x-www-form-urlencoded; charset=UTF-8 不应该是 json 吗?
【解决方案2】:

实际上我的问题不在于 ajax,而是我的 Web 界面正在调用另一个域上的我的 api。

你想在调试时在浏览器的控制台中寻找这一行:

 GET http://localhost:49375/a5771720d9814c7faa43fd65fd3aa34d/arterySignalR/negot…9399%2FFile%2FManage&browserName=Chrome&clientProtocol=1.3&_=1404748489560 net::ERR_CONNECTION_REFUSED 

这是启用跨域请求的方法: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-23
    • 2023-03-28
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 2014-02-23
    • 2017-12-09
    • 2010-09-29
    相关资源
    最近更新 更多