我需要使用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电话)。
答案 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)
我看到了一些错误。
您正在呼叫$("#Form").Submit()
....,您没有ID表格的元素。尝试将<form id="theForm">
和将来电更改为$("#theForm").submit()
...
您在页面加载时设置tableStr
变量。看看你的例子,这是空的。然后,您调用Ajax actionlink来填充div。但是,您永远不会再使用收到的AJAX内容更新tableStr
变量。一旦你开始工作,你将向服务器发送一个空字符串。
为什么使用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;
}