使用ASP.NET MVC的Jquery Post未到达Controller

时间:2012-06-18 13:45:24

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

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

我看到使用Sniffer成功传递了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电话)。

4 个答案:

答案 0 :(得分:2)

如果您正在发帖,执行需要[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" });
}

答案 1 :(得分:1)

看起来像你错过了/,试试这个

$.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

的博客文章

答案 2 :(得分:1)

我认为您需要使用httppost:

来装饰您的方法
[HttpPost]
public ActionResult Save(string tableHtml)
{
    Session["TableStr"] = tableHtml;

    return new JsonResult() { Data = true };
}

另外,请确保控制器的路径正确。如果您确定,请使用$.ajax调用代替$.post,并使用错误回调查看出现了什么问题。

答案 3 :(得分:0)

我看到了一些错误。

  1. 您正在呼叫$("#Form").Submit() ....,您没有ID表格的元素。尝试将<form id="theForm">和将来电更改为$("#theForm").submit() ...

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

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

  4. 的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;
        }