无法在javascript中调用C#方法

时间:2015-07-30 10:27:13

标签: javascript c# ajax jqgrid

我想在javascript ajax调用中在aspx页面中调用我的webmethod(C#方法)。 所以在URL中我可以传递Test.aspx / MyMethodName

[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public static string Loadsites() {
    var jsondata = JsonConvert.SerializeObject(lstsitename);
    // test.Visible = true; return jsondata;
} 
$(document).ready(function () {        
   LoadGrid = function () {
    alert('Loading Grid data');
    jQuery("#Grid").jqGrid({           
        mtype: 'POST',
        url: 'Test.aspx/Loadsites',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        colNames: ['SiteName', 'Description' ],
        colModel: [
                    { name: 'SiteName', index: 'SiteName' },
                    { name: 'Description', index: 'Description' }
        ],
        sortname: "SiteName",
        rowNum: 10,
        viewrecords: true,
        sortorder: "asc",
        caption: "Site Details",
        width: "auto",
        height: "auto",
        pager: '#Pager'

    });

    jQuery("#Grid").jqGrid('navGrid', '#Pager', { edit: true, add: true, del: true });
 }
});

我在方法中尝试静态,但也没有工作

2 个答案:

答案 0 :(得分:0)

如果将此属性[WebMethod]放在方法签名之上,则可以实现所需。

此外,您的方法应定义为static

答案 1 :(得分:0)

双方都有错误(在服务器端和客户端)。

在服务器端,您声明string作为Loadsites的结果,并明确地致电JsonConvert.SerializeObject。这是不对的。设计WebMethod是为了转换为JSON或XML 内部。因此,应该返回object(仅return lstsitename;)而不是stringWebMethod会根据HTTP请求的contentType将结果转换为JSON。如果再次调用JsonConvert.SerializeObject,则返回的数据是包含引号的字符串,例如[{"myCol1": "value1"}]。由于JSON标准,此类字符串将再次转换为JSON ,并且从服务器返回的结果数据将类似于"[{\"myCol1\": "value1\"}]"。转换正确的JSON数据[{"myCol1": "value1"}]将在客户端的JavaSript中获取对象数组。解析两次转换后的数据"[{\"myCol1\": "value1\"}]"将生成字符串 '[{"myCol1": "value1"}]'而不是对象数组。

客户端也存在一些重要错误(在创建jqGrid的JavaScript代码中):

  • 您使用未知选项dataType: "json"代替datatype: "json"。因此,jqGrid将使用默认值datatype: "xml",这是错误的。
  • 您使用未知选项contentType: "application/json; charset=utf-8"而不是使用允许指定Ajax选项的ajaxGridOptionsajaxGridOptions: { contentType: "application/json; charset=utf-8" }
  • 如果您没有实现服务器端数据分页,则应添加loadonce: true选项。
  • 您指定LoadGrid而未声明变量,并且您未在$(document).ready(...);内调用该函数。而不是你应该只执行创建jqGrid的相应代码并通过调用navGrid添加导航栏。