返回c#列表使用ajax

本文关键字:使用 ajax string 列表 返回 | 更新日期: 2023-09-27 18:18:44

我有以下列表-

public static List<string> dataNodes;

然后我希望能够通过使用ajax访问它-

      $.ajax({
                type: "POST",
                url: "Default.aspx/dataNodes",
                success: function (data) {
                    alert(data.d);
                },
                error: function () {
                    alert("error");
                }
            });

然而每次我做这个数据。d是undefined,有办法吗?

返回c#列表<string>使用ajax

下面是一个示例。

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public List<string> GetDataNodes()
{
  var dataNodes = new List<string>{ "aaa", "bbbb"};
  return dataNodes;
}

然后将Javascript更改为

$.ajax({
    type: "GET",
    url: "Default.asmx/GetDataNodes",
    success: function (data) {
        alert(data[0]);
    },
    error: function () {
         alert("error");
    }
});

.aspx改为.asmx (service) and,这样就可以了

出于许多原因(安全性是一个大问题),您不希望Ajax调用能够直接访问服务器端属性和字段(因为任何了解您的代码的人都可以这样做)。这就是为什么当您希望通过Ajax公开一段数据时,需要创建面向公众的API,您需要在服务器上序列化数据,并通过一些请求公开数据,以便使用Ajax使用它。实现这一点的一个常见方法是使用WebMethod属性。

在你的代码后面设置一个这样的WebMethods,就像这样:
[WebMethod]
public static string getStringData() {
    JavascriptSerializer ser = new JavascriptSerializer();
    return ser.Serialize(dataNodes);    
}

这里有一个很好的这种风格的资源:http://aspsnippets.com/Articles/Calling-ASPNet-WebMethod-using-jQuery-AJAX.aspx

那么你的Ajax URL变成Default.aspx/getStringData

话虽这么说,在我看来,如果你像这样公开数据,你可能想要考虑建立一个全rest的web服务或某种公开数据的服务,而不是让你的后台代码来处理它。正如其他人所说,这应该是GET操作,而不是POST

关于如何让web服务设置公开这类数据,这里有一些很好的例子:

  • http://msdn.microsoft.com/en-us/library/t745kdsh (v =应用程序). aspx
  • http://www.tugberkugurlu.com/archive/asp-net-web-forms--calling-web-service-page-methods-using-jquery
  • http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

我建议如果你已经被包围在像dotNet这样沉重的东西中,你应该使用它的内部功能

  • 创建<input type="hidden" runat="server" ...>对象(或其<asp:...>等效对象)
  • 让页面代码保持其值最新,然后
  • 从JavaScript中的"hidden"中获取值

如果您需要控制何时更新值,请使用:

  • __doPostback(),或
  • ClientScriptManager.GetPostBackEventReference。

这些包装器让dotNet编写调用事件处理程序的JavaScript,该事件处理程序将为您更新变量。该代码将更能够避免在同一页面上与其他。net功能发生冲突。

在同一个页面中添加两种post-back机制会要求奇怪的交互,这将很难调试,特别是当您似乎从根本上误解了ajax时。


Ajax将整个页面提交给您的代码并返回输出。因此,除非您的页面代码中有一个路径可以注意到查询字符串上的标记并输出变量的字符串化值,否则这将不起作用。

在Page_Load中添加一个断点,您将看到ajax调用返回到您的页面,就好像它正在准备整个页面的另一个副本。

此时,您可以选择注意到表明这是AJAX的装饰,转移页面准备并将变量内容写入响应,然后跳过进一步处理。

最好准备一个完全不同的URL供Ajax使用,在这种情况下,您应该使用WebServices,正如前面的应答者所指出的。

,但一次。有一种方法完全可以在。net中做到这一点,而且它已经在使用这些机制。因此,当您尝试使用相同的代码出错时,可能会变得非常难以调试。

所以在任何给定的页面上,我要么避免Ajax,要么避免dotNet。