我想调用一个方法jQuery
上的按钮click.This为啥子我到目前为止有:
$("a.AddToCart").click(function () {
var link = document.URL;
$.ajax({
type:"POST",
url: "/Account/AddToCartHack",
data: {url : link},
contentType: "application/json; charset=utf-8",
dataType: "json"
});
});
[WebMethod]
public void AddToCartHack(string url)
{
GeneralHelperClass.URL = url;
}
我想在这里做的是,当我点击与类的链接添加到购物车我要调用的方法AddToCartHack
并把它传递了短路电流的URL作为参数。 我必须做一些错误的,因为它似乎AddToCartHack
不会被调用。
我究竟做错了什么?
有相当多的问题与您的代码,我不知道从哪里开始。 因此,让我们与您进行互动重构会话(如果你不关心我的意见,但只是想看看最终的和推荐的解决方案,只是在回答最后向下滚动)。
第一 :你似乎并不通过返回被取消锚的默认操作false
从.click()
事件处理程序。 如果不这样做,你实际上是让浏览器进行锚的默认操作(正如你知道的锚是重定向到它的href属性所指向的URL。因此这个您的AJAX调用从未有执行时间,因为浏览器已经离开页面,并没有更多的脚本曾经运行)。 因此,从处理程序返回false,让您的AJAX脚本来执行,并保持在同一页上的可能性:
$("a.AddToCart").click(function () {
var link = document.URL;
$.ajax({
type:"POST",
url: "/Account/AddToCartHack",
data: {url : link},
contentType: "application/json; charset=utf-8",
dataType: "json"
});
return false;
});
第二 :您已指定contentType: 'application/json'
请求头,但你不发送任何JSON的。 要发送一个application/x-www-form-urlencoded
请求是用于jQuery的默认值。 所以摆脱你的情况下,这个毫无意义的参数:
$("a.AddToCart").click(function () {
var link = document.URL;
$.ajax({
type:"POST",
url: "/Account/AddToCartHack",
data: {url : link},
dataType: "json"
});
return false;
});
第三 :您已指定你的服务器端代码将返回JSON( dataType: 'json'
),但你的服务器端代码根本不会返回任何东西。 这是一个无效的方法。 在ASP.NET MVC你所说的C#方法都有一个名字。 这就是所谓的控制器操作 。 而在ASP.NET MVC控制器动作返回ActionResults,而不是无效的。 所以,解决您的位指示作用。 也摆脱了[WebMethod]
属性-这是不再在ASP.NET MVC中使用
public class AccountController: Controller
{
public ActionResult AddToCartHack(string url)
{
GeneralHelperClass.URL = url;
return Json(new { success = true });
}
}
第四 :你已硬编码的URL到控制器的动作在你的JavaScript,而不是使用服务器端助手生成该网址。 这里的问题是,如果你在一个虚拟目录部署IIS应用程序代码将打破。 不仅如此-如果你决定修改在Global.asax中的路由模式,你将不得不修改所有的脚本,因为该网址将不再是{controller}/{action}
。 我建议你解决这个问题的方法是使用不显眼的AJAX。 所以,你会简单地生成使用HTML帮助锚:
@Html.ActionLink(
"Add to cart",
"AddToCartHack",
"Account",
null,
new { @class = "AddToCart" }
)
然后悄悄地AJAXify这种定位的:
$('a.AddToCart').click(function () {
var link = document.URL;
$.ajax({
type: 'POST',
url: this.href,
data: { url : link }
});
return false;
});
第五 :你似乎雇用一些document.URL
您的内部变量.click()
处理程序。 它看起来像一个必须已在别处定义了一些全局JavaScript变量。 不幸的是,你还没有表现出哪里这个变量定义的代码的一部分,也不为什么会使用,所以我真的不能提出一个更好的方式来做到这一点,但我真的觉得有什么不对劲吧。 或者哦,等等,难道这是当前浏览器的网址??? 如此,你应该使用window.location.href
属性。 就这样:
$('a.AddToCart').click(function () {
$.ajax({
type: 'POST',
url: this.href,
data: { url : window.location.href }
});
return false;
});
甚至更好,使其原来的锚的一部分(最终和建议的解决方案):
@Html.ActionLink(
"Add to cart",
"AddToCartHack",
"Account",
new { url = Request.RawUrl },
new { @class = "AddToCart" }
)
然后简单地说:
$('a.AddToCart').click(function () {
$.ajax({
type: 'POST',
url: this.href
});
return false;
});
现在好得多相比,现在我们开始了。 您的应用程序现在将在页面上禁用了JavaScript,甚至工作。
放置脚本方法这种方式,如下所示
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
添加成功和错误函数来检查你的Ajax功能
...
$.ajax({
type:"POST",
url: "/Account/AddToCartHack",
data: {url : link},
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(){
alert('success');
},
error:function(){
alert('error');
}
});
....
如果这是Asp.Net web表单,你需要做的webmethod静态或方法无法通过JavaScript访问。
$(document).ready(function () {
$.ajax({
url: "Testajax.aspx/GetDate",
data: "f=GetDate",
cache: false,
success: function (content) {
$('#tableData').append('My Dear Friend');
alert(content);
},
failure: function (response) {
alert("no data found");
}
});
});