调用使用jQuery一个C#方法(Calling a C# method with jquery)

2019-08-05 01:52发布

我想调用一个方法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不会被调用。

我究竟做错了什么?

Answer 1:

有相当多的问题与您的代码,我不知道从哪里开始。 因此,让我们与您进行互动重构会话(如果你不关心我的意见,但只是想看看最终的和推荐的解决方案,只是在回答最后向下滚动)。

第一 :你似乎并不通过返回被取消锚的默认操作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,甚至工作。



Answer 2:

放置脚本方法这种方式,如下所示

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]


Answer 3:

添加成功和错误函数来检查你的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');
                }
            });
        ....


Answer 4:

如果这是Asp.Net web表单,你需要做的webmethod静态或方法无法通过JavaScript访问。



Answer 5:

$(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");
        }


    });
});



文章来源: Calling a C# method with jquery