【问题标题】:Ajax Post Parameter is Always Null in MVC appAjax Post 参数在 MVC 应用程序中始终为空
【发布时间】:2020-04-23 16:20:44
【问题描述】:

我有一个可以在测试应用中运行的简单帖子

控制器代码

public ActionResult Delete(string Id)
{
    ... delete record ...
}

JavaScript

function delAnnouncement(id) {
    $.ajax({
        type: "POST",
        url: "@Url.Action("Delete", "Announcements")",
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify({ "Id": "03d23684-098a-4ae8-8fa2-7d9ce70d63ef" }), // Hard coded for testing
        success: function (data) {
            $("#AnnouncementsPH").replaceWith(data);
        }
    });        
}

我创建了一个简单的测试应用程序,它在那里工作。

我正在寻找关于现有应用程序中可能存在的任何想法,这些想法总是会导致传递的 id 为空。

我尝试过的事情:
两个应用程序之间的路由信息​​相同。
它们都是安全的 https 网站。
现有网站上的其他表格按预期工作。这是唯一使用带有参数的 javascript 帖子的地方。它只是列出所有系统公告的新视图。
据我所知,HTML 是有效的。
Fiddler 显示正在发送的数据。
我试图在Id 中简单地硬编码以通过。

我不知道是什么原因导致 Post 无法工作。

感谢您的任何建议

编辑 1:这里是提琴手 Raw 帖子

POST https://localhost:44300/Announcements/Delete HTTP/1.1
Host: localhost:44300
Connection: keep-alive
Content-Length: 39
Accept: */*
Origin: https://localhost:44300
X-Requested-With: XMLHttpRequest
Content-TypeOfNotification: application/json; charset=utf-8
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
Content-Type: text/plain;charset=UTF-8
Referer: https://localhost:44300/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: jetbrains.charisma.main.security.PRINCIPAL=NmI4YmFhZTExMThjZDZkZjNmZTBhMDNiZWM4NmY3MDYzZWNiMWE3M2ZmZDM5ODMwYjViMjczN2ZkZmU3YmZlZTpyb290; TCSESSIONID=233EBE63123BA35468235F441F54D7E4; ASP.NET_SessionId=ycnx1ejeyahzipwduux2quqz; __RequestVerificationToken=FnOKGFfBZKEBX4E0KBoV9133e5KK3h9Pd_OjDzNPjv7ifMTMk5uHUPmT621hOQFyOCwW5IhdewKLPDMs2_9jY2vVwrHLYOU9f0F86mN-NoQ1; .AspNet.ApplicationCookie=V8ZnbAx_2_H1Wx946VLcQ235XplzC-uvKdw4CP7Sm8ZVnJu9pG63EuzC0ptOZZNBvzZkRjB0RJS25Pn1WHOzeQSrqoWl87keqRDS6_vMwZ9L6PgKU0rJz7OhD7eKps8l3tzR097zI5WbU_chUZFKLLw1c__rfN3Fy6BbHC1qNtgx0C86AShhG5EsNiruYqJZn-Uj7Z2h75YcZctCFniMyuzD-9RetcMjkN3_PbAJg-_urfntG9NwsMEQdBf1b3K9H3GP_wUYRhnbQdNZpuAkAEa6bVfJiHrnKFhnhLkP8BAfocbMKES1wQKbXBfcNn62cEKUu3On3lHNCNN4zEvOhxF1aDaBk-yghOtvtNkROeFTKMQFD0U-XXAf-RKm0Nwgp1Tb2Ip2U42vshDRNGXQSkOojisVUxiPmkrxDtckNycQd0br1cFSqxfeXyg3cg_vKUP1VMBQcBQxZO6MVLSCDdcpANyoE43IoLp3BHgURJZP88vF18JfVV646XGOZ3QU

Id=03d23684-098a-4ae8-8fa2-7d9ce70d63ef

如您所见,Id 已发布到控制器,只是未解析并提供给方法中的参数。

【问题讨论】:

    标签: ajax asp.net-mvc post parameters null


    【解决方案1】:

    你可以像这样附加参数:

    var targeturl = '@Url.Action("Test", "Controller")?id=' + ID;
    
    $.ajax({
        url: targeturl,
        type: "GET",
        success: function(data) { },
        error: function (data) { }
    });
    

    或者你可以直接使用jQuery ajax 数据参数:

    $.ajax({
      type: "POST",
      url: '@Url.Action("Test", "Controller")',
      data: { id: "your-id" }
    })
      .done(function( msg ) {
        alert( "Data Saved: " + msg );
      });
    

    参考:http://api.jquery.com/jquery.ajax/

    【讨论】:

    • 谢谢。 Get 有效,知道帖子为什么不有效吗?我已将此标记为已修复。
    【解决方案2】:

    我在其他任何地方都没有找到这个答案,所以我必须通过实验来发现它。

    1. 您会发现在您的控制器中,它正在接收一个Request.Form 对象,如果您查看Request.Form[0],您会找到您的数据。表单中有数据但 MVC 将其视为 null 的原因是要发布的表单元素的键是 ""(空白)。

    2. 所以客户端,你必须正确设置内容类型,并在你的数据前面加上"data=" + JSON.stringify(mydata),其中"data"是你要添加的键名。

    像这样:

    $.ajax({
        type: "POST",
        url: URL,
        data: "data="+JSON.stringify(data),
        contentType: "application/x-www-form-urlencoded; charset=utf-8"
    

    在服务器端,您的 [HttpPost] 端点必须有一个与您在 AJAX 中声明的键同名的变量作为其输入,如下所示:

    [HttpPost]
    [Authorize]
    public ActionResult Index (string data) // <-- key name
    {
       MyObjectType MyFinalObject = JsonConvert.DeserializeObject<MyObjectType (data);
    }
    

    【讨论】:

      【解决方案3】:

      我认为您不必为数据使用JSON.stringify。默认情况下,他们将使用 ajax 将值作为 Jason 发送。

      试试这个

      data : { Id: "03d23684-098a-4ae8-8fa2-7d9ce70d63ef" } 
      

      【讨论】:

      • 谢谢,但很遗憾,我得到了同样的结果。我知道如果我创建一个快速应用程序并添加我发布的代码,它确实可以工作,只是不在现有应用程序中。然而,我看不出这两个应用程序之间有什么真正的区别,这会导致它在一个应用程序中工作,而在另一个应用程序中却不能。
      【解决方案4】:

      没有一个答案对我有用,所以我成功地解决了:

      带有 JQuery 的 JavaScript:

      function sendAjaxPostRequest(url, id, value) {
          $.post(url+'?id='+id+'&value='+value,
              function (returnedData) {
                  console.log(returnedData);
              });
      }
      

      C# ASP.NET:

      // POST api/<controller>
      public void Post(int id, string value)
      {
          Console.WriteLine($"{id}: {value}");
      }
      

      Post 参数列表签名必须与 POST 请求 url 匹配,例如?id=123 表示必须有一个方法Post(int id)。希望这对某人有所帮助。

      在指责前端 JS 之前,请务必使用 Postman 测试您的后端!


      奇怪的是 JS 的 $.ajax({ ... }); 本身不起作用,但如果我同时使用 JQuery 的 $.post(...); 和 $.ajax({...}) POST 请求,那么它们都起作用了 - 很奇怪。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-05
        • 1970-01-01
        • 2020-12-27
        相关资源
        最近更新 更多