我有以下列表 -
public static List<string> dataNodes;
然后我想通过使用ajax -
来访问它 $.ajax({
type: "POST",
url: "Default.aspx/dataNodes",
success: function (data) {
alert(data.d);
},
error: function () {
alert("error");
}
});
但是每次我执行此数据时都是undefined
,有没有办法做到这一点?
答案 0 :(得分:1)
以下是您开始的示例。
[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
(服务),并且应该这样做。
答案 1 :(得分:0)
我建议如果你已经被像dotNet这样重的东西所包围,你应该使用它的内部力量
<input type="hidden" runat="server" ...>
对象(或其<asp:...>
等效对象)如果您需要控制值何时更新,请使用:
这些包装器让dotNet编写调用事件处理程序的JavaScript,它会为你更新变量。该代码将更能够避免在同一页面上与其他dotNet功能发生冲突。
向同一页面添加两个回发机制是要求进行难以调试的奇怪交互,特别是因为你似乎从根本上误解了ajax。
Ajax将整个页面提交给您的代码并返回输出。因此,除非您在页面代码中有路径注意到查询字符串上的标记并输出变量的字符串化值,否则这将无效。
在Page_Load中放置一个断点,你会看到ajax回调到你的页面,好像它正在准备整个页面的另一个副本。
您可以选择注意到装饰,表明这是AJAX,转移页面准备并将变量内容写入响应,然后跳过进一步的处理。
最好为Ajax准备一个完全不同的URL,在这种情况下,您应该使用WebServices
,如前一位受访者所述。
但是,再一次。有一种方法可以完全在dotNet中完成,并且它已经在使用这些机制。因此,当出错时,尝试使用相同的尝试会变得很难调试。
所以我要么在任何给定页面上避免使用Ajax,要么避免使用dotNet。
答案 2 :(得分:0)
由于许多原因,安全性很大,您不希望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网址变为Default.aspx/getStringData
话虽如此,在我看来,如果您公开这样的数据,您可能需要考虑设置一个REST-full Web服务或某种服务来公开数据而不是让您的代码隐藏处理这个。正如其他人所说,这应该是GET
操作,而不是POST
。
有关获取Web服务设置以公开此类数据的一些很好的示例,以下是一些有用的文章: