我正在尝试使用jQuery,以便在单击某个按钮后触发Ajax调用。我已经阅读了几个可能遇到的语法和问题的例子,但未能找到适合我的工作的解决方案。这是代码。
控制器方法:(HomeController.cs)
[HttpPost]
public JsonResult ChangeCompany(string companyCode)
{
return Json(new { result = companyCode }, JsonRequestBehavior.AllowGet);
}
jQuery代码:
function changeCompany(company) {
$.ajax({
url: '@Url.Action("ChangeCompany", "Home")',
type: 'POST',
data: JSON.stringify({ companyCode: company }),
success: function (data) {
alert("Company: " + data);
},
error: function (req, status, error) {
alert("R: " + req + " S: " + status + " E: " + error);
}
});
}
最后,我用以下方法调用此函数:
$('.companyButton').click(function () {
compCode = $(this).text();
debug("Click event --> " + $(this).text());
changeCompany(compCode);
});
我的调试消息显示正常,并且Ajax调用经常失败并显示以下警告:R: [object Object] S: error E: Not Found
我不完全确定如何做到这一点。
我知道关于这个主题有几个问题,但是它们似乎都没有解决我的问题,而且老实说我不确定这些代码块有什么问题。任何见解将不胜感激。
编辑: 如果值得注意,这适用于移动设备。在Windows 8 Phone Emulator(Internet Explorer)和jQuery Mobile上进行测试。不确定这是否会影响Ajax
编辑2:
在查看原始网络调用之后,似乎'Url.Action("ChangeCompany", "Home")'
没有被转换为正确的URL而是被直接调用,就好像它是原始URL文本一样。这是由于过时的jQuery还是其他一些因素?
答案 0 :(得分:6)
好的EDIT2似乎是你在一个单独的JavaScript文件中使用url: '@Url.Action("ChangeCompany", "Home")',
。你只能在.cshtml文件中编写剃刀代码而它在.js文件中不起作用
答案 1 :(得分:1)
您在AJAX调用中缺少一些重要参数。更改您的AJAX调用如下:
function changeCompany(company) {
$.ajax({
url: '@Url.Action("ChangeCompany", "Home")',
type: 'POST',
data: JSON.stringify({ companyCode: company }),
success: function (data) {
alert("Company: " + data);
},
error: function (req, status, error) {
alert("R: " + req + " S: " + status + " E: " + error);
}
});}
然后,您可以使用[HttpPost]
属性注释您的控制器方法,如下所示;
[HttpPost]
public JsonResult ChangeCompany(string companyCode)
{
return Json(new { result = companyCode }, JsonRequestBehavior.AllowGet);
}
答案 2 :(得分:0)
请注意,您的操作不会直接返回companyCode
。因此,您将其分配给Json result
属性
在您的成功功能中,您需要显示结果:
success: function (data)
{
alert("Company: " + data.result);
}
此外:E: Not Found
告诉我您可能遇到一些路由问题。如果您在ChangeCompany
操作中设置了一个断点,它是否被击中?