如何从jQuery对象文本正确调用服务器端ASP.NET并将数据返回给jQuery

How to properly call server-side ASP.NET from jQuery object literal and return data to jQuery

本文关键字:jQuery NET ASP 数据 返回 服务器端 调用 对象 文本      更新时间:2023-09-26

这个问题与我以前的问题密切相关:如何从ASP.NET中检索JSONdata并将其发送到jQuery?(实现FullCalendar)。


我正在尝试在ASP.NET中设置以下对象文字:

$(document).ready(function () {
    $('#calendar').fullCalendar({
        events: GetEvents(start, end) //<-- This line is invalid
    }
}

上面无效行的右侧应该包含对JSON数据的引用。

由于我认为这是一个客户端到服务器到客户端的调用,所以如果我这样做的方式不对,恐怕会出现潜在的安全问题。

我找到了一个从javascript调用服务器端方法的教程(在我看来已经过时了),但有没有一种合适的方法可以在ASP.NET中动态地将jQuery对象文本绑定到数据集?

例如,如何在ASP.NET中创建只能由具有适当权限的登录用户调用的响应(每个用户只能编辑日历中0–*特定用户绑定事件)?如何将该响应返回到jQuery对象文字?

编辑:

根据要求,以下是GetEvents(start, end)方法的一些伪代码:

public JSONData GetEvents(DateTime start, DateTime end) {
    User user = HttpContext.Current.User;
    if(user.Identity.IsAuthenticated && IsValidTimePeriod(start, end)) {
        List<Event> events = EntityFrameWorkService.GetEventsFromDataBase(user, start, end);
        JSONData result = ConvertEventDataToJSON(events);
        return result;
    }
    return null;
}

JSONData是应该返回的任何类型的JSON数据对象类型,而EntityFrameWorkService是一个在GUI和实体框架之间具有服务方法的假想类。

好的,根据问题中包含的链接,您似乎正在尝试使用页面方法将数据从服务器获取到客户端。这只是将数据从服务器中继到客户端的一种可能方式,但我将在这个答案中坚持使用它。

在实现页面方法时,有一些重要的事情需要记住:

  1. 方法必须是publicstatic。这意味着您不能像回发时那样访问页面中的控件
  2. 该方法必须使用[WebMethod]属性进行修饰
  3. 为了获得正确的javascript方法来调用page方法,您的页面上必须有一个ScriptManager对象(不是严格意义上的,您也可以使用常规ajax来调用它们,但PageMethods对象是由脚本管理器添加的):

    <asp:ScriptManager ID="ScriptManager1" runat="server"   
          EnablePageMethods="True">
    </asp:ScriptManager>
    
  4. 从脚本调用方法时,请使用PageMethods对象。如果您的服务器端web方法是:

    [WebMethod]
    public static string Echo(string inputValue)
    {
        return inputValue.ToUpperInvariant();
    }
    

    然后你可以这样调用(javascript):

    function echoSucceed(data) {
        alert(data);
    }
    function echoError(data) {
        alert('fail');
    }
    PageMethods.Echo("conver this to upper case", echoSucceed, echoError);
    

    请注意,我们将函数引用传递给javascript PageMethods.Echo(...)。根据页面方法调用成功还是失败,将调用其中一个函数。

但你问我的问题是什么

首先,在代码后面创建page方法。请注意,响应将自动序列化和反序列化,因此您可以让page方法返回例如事件列表:

[WebMethod]
public List<Event> GetEvents(DateTime start, DateTime end) { ... }

此列表将成为接收端的一个数组。

接下来,创建一个帮助javascript函数,帮助您调用page方法。类似这样的东西:

function getEvents(start, end) {
    var results;
    PageMethods.GetEvents(start, end, function (data) { results = data; }, function(data) { alert('Error while fetching events'); });
    return results;
}

最后,调用该方法并将结果传递给日历。

编辑:一些其他选项(页面方法的替代方案):

  • 普通旧web服务(.asmx)
  • WCF服务(.svc)
  • 泛型处理程序(.ashx),或者更常见的任何自定义HttpHandler,请参阅此处
  • 网络API(新来的孩子,见这里)

如何使用这些的确切细节因您选择的不同而有所不同。通过使用合适的关键字组合在网上搜索,可以很容易地找到每种教程。

类似这样的东西:

$(document).ready(function () { 
   $.ajax({
      type: "POST",
      url:'[YOUR_SERVER_URL]',
      data:{start:'01/01/2012',end:'31/12/2012'},
      success: function(data) {
        $('#calendar').fullCalendar({
            events: data
        });
      } 
   });
});

我知道您正试图从ASP.net将一些JSON生成为现有的javascript,但另一种方法是将JSONData输出到某种服务中,并使用javascript/jquery来获取JSON:

  1. 配置服务器,使其在点击时使用GetEvents方法以JSON纯文本响应"http://yourserver/events/?start=somedate&end=其他日期"
  2. 使用以下命令进行jquery调用:$.getJSON("http://yourserver/events/?start=somedate&end=someotherdate")