【问题标题】:How to call C# method in jQuery?如何在 jQuery 中调用 C# 方法?
【发布时间】:2013-10-31 08:34:31
【问题描述】:

我正在使用一个图表,它应该从 C# 获取输入来绘制图表。我正在使用 JSON 将值从 C# 返回到 jQuery。无论如何它对我没有帮助,我做错了什么?

这是我的 aspx 代码:

<script type="text/javascript">
    $(document).ready(function () {
        var source = {};

        $.ajax({
            type: 'POST',
            dataType: 'json',
            url: "Default.aspx/getall",
            contentType: 'application/json; charset=utf-8',
            cache: false,
            success: function (response) {

                source = $.parseJSON(response.d);

            },
            error: function (err) {
                alert('Error');
            }
        });
</script>

这是我的 C# 代码:

public class sampledata
{
    public string Day { get; set; }
    public int Keith { get; set; }
    public int Erica { get; set; }
    public int George { get; set; }
}

public partial class _Default : System.Web.UI.Page 
{
    List<sampledata> s = new List<sampledata>();

    protected void Page_Load(object sender, EventArgs e)
    {
        s.Add(new sampledata { Day = "monday", Keith = 20, Erica = 15, George = 25 });
        s.Add(new sampledata { Day = "tuesday", Keith = 25, Erica = 20, George = 35 });

        Session["data"] = s;                  
    }

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public static List<sampledata> getall()
    {
        List<sampledata> data = (List<sampledata>)HttpContext.Current.Session["data"];
        return data;
    }
}

【问题讨论】:

标签: c# asp.net jquery


【解决方案1】:

我测试了你的代码,一切似乎都很好,除了我将 List 序列化为字符串并返回。

$(window).load(function () {
    $.ajax({
        type: "POST",
        url: "PageMethodTest.aspx/getall",
        data: "{}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: fnsuccesscallback,
        error: fnerrorcallback
    });
});

function btnclick() {}

function fnsuccesscallback(data) {
    alert(data.d);

}

function fnerrorcallback(result) {
    alert(result.statusText);
}

服务器端代码:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static String getall()
{
    List<sampledata> data = (List<sampledata>)HttpContext.Current.Session["data"];
    JavaScriptSerializer js = new JavaScriptSerializer();

    return js.Serialize(data);
    //return data;
}

结果是:

您可以改进将输出用作图表的来源。

【讨论】:

    【解决方案2】:

    您可以使用 PageMethods 代替 ajax 回发:

    在 C# 页面中:

    [WebMethod]
    public static List<sampledata> getall()
    {
        List<sampledata> data = (List<sampledata>)HttpContext.Current.Session["data"];
        return data;
    }
    

    在aspx页面中:

    $(document).ready(function () {
        var data=PageMethods.getall(OnSuccess);
    
        function OnSuccess() {
            alert("Success");
        }
    });
    

    对于使用 PageMethods,您还需要在表单标签中添加它:

    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
    

    【讨论】:

      【解决方案3】:

      如果您不想依赖 Microsoft 的 AJAX 实现(WebMethodAttributeScriptManager,不必担心响应的 .d 属性等),您可以使用干净的 JSON 调用ASHX 处理程序。您必须自己做一些工作,但是通过做更传统的 AJAX,您可以摆脱 WebForms 的束缚。

      对于您的示例,C# 部分如下(注意 IRequiresSessionState 实现,它使您的会话可用):

      // something.ashx.cs
      public class something : IHttpHandler, IRequiresSessionState {
          public void ProcessRequest(HttpContext context) {
              context.Response.ContentType = "application/json";
              context.Response.Write(JsonConvert.SerializeObject(context.Session["data"]));
          }
      
          public bool IsReusable { get { return false; } }
      }
      

      您的 javascript 调用只是对这个 something.ashx 文件的调用:

      jQuery.ajax({
          url: "something.ashx",
          type: "post",
          dataType: "json"
      }).done(function(result) {
          console.log(result);
      });
      

      您没有任何 POST 参数,但如果有,您只需将它们包含在您的调用中,并直接从处理程序中的 Request 读取它们:

      jQuery.ajax({
          ...
          data: { requestMessage: "Hello!" }
      });
      
      
      public void ProcessRequest(HttpContext context) {
          string requestMessage = context.Request["requestMessage"]; // Hello!
          ...etc...
      }
      

      【讨论】:

      • 快速提问,我试图理解它,但无法弄清楚.done(function(result))result 变量中返回的内容。
      • @CodeIt done 函数的参数是一个包含 AJAX 调用结果的函数,其类型为您要求的类型。在此示例中,dataType 字段设置为json,这意味着 jQuery 将足够智能地查看来自服务器的 JSON 格式的结果,并将其转换为 JSON 格式的对象代表。例如,如果您的服务器发送{"name":"John"},那么result 实际上将是一个javascript 对象{name: "John"}See the docs 了解 jQuery AJAX 的多种使用方式。
      • 很好的解释@Joe Enos。以及服务器应该如何发送json 响应?我实际上发现这个答案独特而整洁,所以我试图深入挖掘它。对不起,如果我是书呆子。
      • @CodeIt 服务器可以根据需要构建 JSON。在此答案的示例中,它使用JsonConvert.SerializeObject 方法,该方法是 JSON.NET 库的一部分,是 .NET 中最常见的 JSON 库,然后它将 JSON 和内容类型直接写入响应。 ASP.NET MVC 有一个内置方法(Json 方法)将 JSON 写入响应。其他服务器框架将有自己的方法 - 您必须查看 PHP 或 Rails 或其他任何东西的文档,以找出最好的方法。
      猜你喜欢
      • 2019-05-23
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 2011-08-21
      • 1970-01-01
      • 2017-08-09
      • 2012-12-14
      相关资源
      最近更新 更多