1

所以我使用TEXTAREA标签发送评论文本(最多 1500 个字符)但它不起作用。

当我只用几个词发送时,它工作正常。

任何线索,伙计们?

错误

Failed to load resource: the server responded with a status of 400 (Bad Request) 

JS

var commentText = $("#commentTextArea").val();
        if (commentText.length > 0) {
             var urlGetComments = window.location.protocol + '//' + window.location.host + "/Gadget/PostComment/" + userId  + "/" + commentText;
             $.ajax({
                 type: "POST",
                 url: urlGetComments,
                 data: "",
                 contentType: "application/json; charset=utf-8",
                 dataType: "json",
                 success: function (dataComments) {
                     if (dataComments.html != null) {
                         $('#divCommentsData').html(dataComments.html);
                     }
                 }
             }); 
        }

C#

[AcceptVerbs("POST")]
[HttpPost]
[ValidateInput(false)]
public JsonResult PostComment(string userId, string commentText)
{
    try
    {
4

7 回答 7

4

您正在使用 URL 传递信息,并且许多服务器对 URL 中的字符有限制。由于您的操作方法接受 POST 请求,因此您可以将数据包含在“数据”参数中,而不是将其附加到 URL。

$.ajax({
    type: "POST",
    url: urlGetComments,
    data: { 'commentText': commentText },
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (dataComments) {
        if (dataComments.html != null) {
            $('#divCommentsData').html(dataComments.html);
        }
    }
}); 
于 2013-09-10T12:30:26.250 回答
2

您可以将其设置data为:

data: "{userId:1, commandText:'cmd text'}",

并将其更改url为:

var urlGetComments = window.location.protocol + '//' + window.location.host + "/Gadget/PostComment;
于 2013-09-10T12:32:22.480 回答
2

(用于有问题的评论)

首先,创建 URL 的最佳方法是使用 URL.Action 方法隐藏标签输入,如下所示:

<input type="hidden" id="url-gadget-comment" 
       value="@Url.Action("PostComment", "Gadget")" />

所以你可以在html之外拥有脚本。

然后使用此值并通过“POST”发送数据:

var commentText = $("#commentTextArea").val();
if (commentText.length > 0) {

   $.ajax({
      type: "POST",
      url: $('#url-gadget-comment').val(),
      data: { userId: userId, commentText: commentText },
      contentType: "application/json; charset=utf-8",
      dataType: "json",
      success: function (dataComments) {
         if (dataComments.html != null) {
            $('#divCommentsData').html(dataComments.html);
         }
      }
    }); 
}
于 2013-09-10T12:41:43.783 回答
2

打电话前先放这个

jQuery.ajaxSettings.traditional = true;
于 2013-10-10T10:35:43.100 回答
1

浏览器和服务器对查询字符串的长度进行了限制,因此会出现 HTTP 400 错误。在 ASP.Net 中,默认为 2048,在 web.config 的 HttpRuntime 部分设置,请参阅http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.maxquerystringlength.aspx

您以错误的方式使用 POST,在 url 中传递数据。您应该将数据放在 POST 请求的数据字段中。

您可以尝试:

var commentText = $("#commentTextArea").val();
if (commentText.length > 0) {
     var urlGetComments = window.location.protocol + '//' + window.location.host + "/Gadget/PostComment/";
     $.ajax({
         type: "POST",
         url: urlGetComments,
         data: {"userId": userId, "commentText": commentText},
         contentType: "application/json; charset=utf-8",
         dataType: "json",
         success: function (dataComments) {
             if (dataComments.html != null) {
                 $('#divCommentsData').html(dataComments.html);
             }
         }
     }); 
}
于 2013-09-10T12:36:45.557 回答
1

我最近遇到了同样的错误。(帖子上出现 400 错误)

我发现错误是因为我的 $.Ajax 方法的数据部分需要更多引号。这对我有用。在 CSHTML 页面中:

            var vals = cells.toString();

            $.ajax({
                type: "POST",
                url: '@Url.Action("TheAction", "theControl")',
                contentType: "application/json; charset=utf-8",
                data: "{'IDS':'" + vals + "'}",
                dataType: "json",
                success: function (response) {

                    var input = "";
                    document.getElementById("SomeItem").innerHTML = input
                },
                failure: function (response) {
                }
            });

在控制中:

    [HttpPost]
    public JsonResult TheAction(string IDS)
    {
        ASPNETUSER userProfile = db.ASPNETUSERS.Find(User.Identity.GetUserId());

        //Do something super cool with IDS    
        var retval = <do something with ids>;

        return Json(retval , JsonRequestBehavior.AllowGet);
    }

对我来说,关键是这部分 ajax 中的所有引号,以便值 vals 用单引号括起来,而 IDS 用单引号括起来:

    data: "{ 'IDS' : ' " + vals + " '} ",

对我来说,vals 是一串逗号分隔的 IDS,如果用户选择了页面上的所有 IDS,对于 GET 函数来说它可能会变得太长。

于 2017-02-09T15:54:48.607 回答
0

谢谢大家!但是对我有用的最终解决方案就是那个。

var commentText = $("#commentTextArea").val();
if (commentText.length > 0) {
var urlGetComments = window.location.protocol + '//' + window.location.host + "/Gadget/PostComment/`
var params = { userId = 1, commentText: commentText };
                 $.ajax({
                     type: "POST",
                     url: urlGetComments,
                     data: JSON.stringify(params),
                     contentType: "application/json; charset=utf-8",
                     dataType: "json",
                     success: function (dataComments) {
                         if (dataComments.html != null) {
                             $('#divCommentsData').html(dataComments.html);
                         }
                     }
                 }); 
            }

它基于Using jQuery AJAX to POST multiple variables to an ASP .NET MVC Controller

于 2013-09-10T13:01:34.763 回答