【问题标题】:Access Session data from ASP.NET page using jquery使用 jquery 从 ASP.NET 页面访问会话数据
【发布时间】:2010-07-14 02:24:59
【问题描述】:

我正在尝试使用 jQuery 传递存储在我的 ASP.NET 页面的 Session 对象中的变量,以百分比表示在服务器上运行的进程的进度。

即:

Session['progress'] = 37;

我在这里查看了一些答案;我的代码使用与此处正确回答的问题相同的方法:

<head>
...
    <script type="text/javascript">  
        function updateProgress() {
             var progress = '<%Session["progress"].ToString();%>';
        } 
    </script>
...
</head>

ASP.NET 编译器返回NullPointerException。我不确定这是否是因为尚未实例化 Session 对象(因为这是在编译时发生的);或者 Session 对象可能没有正确接收变量(如果是这种情况,我该如何检查?)

有什么想法吗?

我需要想办法将这个值从服务器传递到客户端,以便可以为用户更新 jQuery 进度条。

谢谢!

【问题讨论】:

    标签: asp.net jquery session-variables


    【解决方案1】:

    如果您想使用 jQuery 从页面中的会话变量中获取实时变化的数字,则需要发出某种类型的 ajax 请求。要访问会话状态中的值,您可以编写一个函数 [WebMethod] 将获取/发送数据发送回您的 jQuery 请求。

    jQuery 请求:

    jQuery.ajax({
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        data: '{}',
        dataType: 'json',
        url: 'Default .aspx/TestMethod',
        success: function(result){
            alert(result.d);
        }
    });
    

    服务器页面WebMethod:

    using System;
    using System.Web.Services;
    
    namespace JqueryAjaxText
    {
        public partial class _Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
    
            }
    
            [WebMethod]
            public static string TestMethod()
            {
                return Session["progress"].ToString();
            }
        }
    }
    

    【讨论】:

    • 我已经尝试过这种方法;我收到以下错误:“CS0120:非静态字段、方法或属性‘System.Web.UI.Page.Session.get’需要对象引用”
    • 你能用'Session["progress"].ToString();'在静态 WebMethod 中?
    • 静态方法中的会话,你是怎么做到的?
    【解决方案2】:

    我认为您误解了事情发生的顺序。虽然 SageNS 发现了您的错误,但他并没有解决您的问题。

    您的代码只是将一个数字写入 javascript 代码,用户会看到:

    <head>
    ...
        <script type="text/javascript">  
            function updateProgress() {
                 var progress = '37';
            } 
        </script>
    ...
    </head>
    

    对 updateProgress() 的连续调用将始终返回 37。

    如果您想定期更新服务器的进度,您需要使用 jQuery 的 .ajax() 函数对服务器进行异步调用。

    【讨论】:

    • Ajax 调用只能对静态 Web 方法进行,并且这不能访问存储在非静态对象中的任何数据。我需要通过静态方法访问存储在已经存在的对象中的数据 - 这是我不太确定的。
    【解决方案3】:

    您可以通过创建 WCF 服务并将您的 $.ajax() 调用切换为 GET 而不是 POST 来构建 Zachary 的答案并更进一步。它不会有那么大的请求(不是说 POST 有那么大),但您也将使用正确的 HTTP 动词。 (POST 用于插入;GET 应用于检索数据)。

    您的 jQuery 调用可能如下所示:

    jQuery.ajax({ 
        type: 'GET', 
        dataType: 'json', 
        url: 'MyService.svc/GetServerProgress', 
        success: function(result){ 
            alert(result.d); 
    });
    

    然后您将创建一个 WCF 服务并创建一个名为 GetServerProgress 的服务方法。

        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetServerProgress")]
        public int GetServerProgress()
        {
            return 37;
        }
    

    最后,您可能希望客户端有一些 JavaScript 调用 setTimeout() 到您的 $.ajax() 方法,以便您定期从 WCF 服务检索服务器的进度。

    祝你好运!

    【讨论】:

      【解决方案4】:

      使用

      <%=Session["progress"].ToString()%>
      

      将数据输出到html页面

      【讨论】:

      • 我已经这样做了,但是当页面编译时我得到一个 NullPointerException ?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      • 2011-03-27
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多