【问题标题】:Jquery Post using ASP.NET MVC isn't reaching the Controller使用 ASP.NET MVC 的 Jquery Post 未到达控制器
【发布时间】:2012-06-20 12:06:06
【问题描述】:

我需要使用 POST 将用户的表信息发送到 MVC 控制器(以将其保存在服务器的会话中)。

我看到使用嗅探器成功传递了 POST 的信息,但它从未到达实际的 MVC 控制器(它从未到达断点!)。

我的代码:

<script type="text/javascript">
    $(document).ready(function () {
        $("#btnSave").click(function () {
            var tableStr = $("#divTable").html();
            $.post("Home/Save/", tableStr, function (data) {
                if (data) {
                    alert("Great success!");
                }
                else {
                    alert("Fail!");
                }
            });
            return false;
        });
    });
</script>

<h2><%: ViewBag.Message %></h2>
<%=Ajax.ActionLink("Show Users", "LoadUsers", new AjaxOptions() { InsertionMode = System.Web.Mvc.Ajax.InsertionMode.Replace, UpdateTargetId = "divTable" }) %>

<center><div id="divTable"></div></center>
<input type="button" id="btnSave" value="Save" />

控制器:

    [HttpPost]
    public ActionResult Save(string tableHtml)
    {
        Session["TableStr"] = tableHtml;
        return new JsonResult() { Data = true };
    }

我做错了什么??谷歌搜索了好几个小时!

有没有更简单的方法可以将此信息传递给我的服务器会话? 这必须是 AJAX(A-Synchronic 调用)。

【问题讨论】:

  • 用谷歌搜索了几个小时 - 没有提到将 [HttpPost] 添加到您的保存操作的结果?
  • 如果遇到 404 错误,请尝试在公共控制器方法上方添加 [HttpPost] 属性。
  • 1.添加 [HttpPost] 并没有改变任何东西。 2. 我没有收到任何 404,看起来视图只是重置了(没有在 Session 中保存变量)。
  • 视图重置,因为您返回的是 ViewResult 而不是 JsonResult。请参阅下面的答案。

标签: jquery ajax asp.net-mvc post controller


【解决方案1】:

确实需要[HttpPost],如果您正在发帖,请不要删除它,即使它仍然不起作用。您还需要确保返回 JSON 数据。

假设您这样做了并且您的控制器实际上被正确引用,您可以尝试显式声明您的 AJAX 元素以确保所有内容都正确传递,包括您的有效负载的名称:

$("#form").submit(function () {
    $.ajax({           
       type: 'POST',
       dataType: 'json',
       url: '/Home/Save/', 
       data: { tableHtml: tableStr }, 
       success: function (data) {
            ...
       }
    });
});

[HttpPost]
public JsonResult Save(string tableHtml)
{
    Session["TableStr"] = tableHtml;
    return Json(new { Data = "true" });
}

【讨论】:

    【解决方案2】:

    你好像少了一个/,试试这个

    $.post("/Home/Save/", tableStr , function (data) {
                if (data) {
                    alert("Great success!");
                }
                else {
                    alert("Fail!");
                }
            });
    

    这是一篇关于这样做的博客文章http://bob-the-janitor.blogspot.com/2011/11/more-ajax-with-mvc-using-partial-views.html

    【讨论】:

      【解决方案3】:

      我认为你需要用 httppost 来装饰你的方法:

      [HttpPost]
      public ActionResult Save(string tableHtml)
      {
          Session["TableStr"] = tableHtml;
      
          return new JsonResult() { Data = true };
      }
      

      另外,请确保您的控制器的路径正确。如果您确定,请使用$.ajax 调用而不是$.post,并使用错误回调来查看问题所在。

      【讨论】:

        【解决方案4】:

        我发现这有一些问题。

        1. 您正在调用$("#Form").Submit()....,您没有具有 ID 表单的元素。尝试输入&lt;form id="theForm"&gt; 并将您的呼叫更改为$("#theForm").submit()...

        2. 当页面加载时,您正在设置 tableStr 变量。看你的例子,这是空的。然后,调用 Ajax actionlink 来填充 div。但是,您永远不会使用 AJAX 接收的内容再次更新您的 tableStr 变量。一旦你让它工作,你将向服务器发送一个空字符串。

        3. 为什么要使用 FORM 元素来执行此操作?表单通常用于从用户那里收集信息以提交给服务器,在本示例中,您不收集数据,仅发送 div 的内容。您可以有一个没有表单的按钮来执行相同的操作,并且在单击按钮时会抓取“DivTable”元素中的任何内容:

        Javascript

        $(document).ready(function () {
            $("#myButton").click(function () {
               var tableStr = $("#divTable").html();
               $.ajax({           
                  type: 'POST',
                  dataType: 'json',
                  url: '/Home/Save/', 
                  data: { tableHtml: tableStr }, 
                  success: function (data) {
                     alert("Great success!");
                   },
                  error: function(data){
                     alert('fail');
                  }
               });
            });
          });
        

        控制器

        [HttpPost]
        public ActionResult Save(string tableHtml)
        {
            Session["TableStr"] = tableHtml;
        
            return new JsonResult() { Data = true };
        }
        

        HTML

        <center><div id="divTable"></div></center>
        <input type="button" id="myButton" value="Save some stuff"/>
        

        4.为什么这仍然是必要的?查看这段代码,您似乎正在从对服务器的 Ajax 调用中填充一个列表(使用 Ajax.ActionLink),然后将该列表重新提交回服务器以存储在会话中?如果正确,只需在调用 Ajax 链接时将信息存储在会话中。

        public ActionResult LoadUsers()
            {
                var UserInfoHtmlString = GetYourUserInfo();
                Session["TableStr"] = UserInfoHtmlString ;
                return UserInfoHtmlString;
            }
        

        【讨论】:

        • 这看起来是正确的方法!但它仍然不是 100% - 首先,我只需要在单击“保存”按钮时保存表的状态,而不是在加载列表时(用户可以更改表的信息)。现在,您的代码似乎正在运行(收到警报!),但是在我的操作中,变量“string tableHtml”为空,并且它在会话中没有保存任何内容。任何想法为什么?
        • @user1461793 - 调用 alert(tablrStr) 并确保您像您认为的那样抓取 HTML。如果那是空白,我们知道从哪里开始寻找问题
        • @user1461793 - 另外,我更新了我的方法以使用 .ajax 方法而不是 .post 方法,我认为我的快速伪代码可能没有发布正确的信息。
        猜你喜欢
        • 2021-08-08
        • 1970-01-01
        • 2010-11-12
        • 2014-10-16
        • 2013-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多