使用Javascript或jQuery检索会话变量的简单而快速的方法?

使用Javascript或jQuery检索会话变量的简单而快速的方法?,javascript,jquery,html,asp.net,session,Javascript,Jquery,Html,Asp.net,Session,我对使用jQuery和/或Javascript开发web UI有点新手。我必须把它作为我项目的一部分,但我不是专家 我真的非常感谢比我更了解这个领域的人的洞察力 我的要求 我在一个更新面板的页面上有一个按钮 当从jQuery/Javascript函数以编程方式单击按钮时,我需要在ASP.Net web应用程序的代码隐藏中的变量中设置一个值 然后我需要将更改后的变量从代码中传递回页面。此变量的值将决定另一个jQuery/Javascript函数在进一步的用户操作中的行为 我无法使用隐藏字段,因为它

我对使用jQuery和/或Javascript开发web UI有点新手。我必须把它作为我项目的一部分,但我不是专家

我真的非常感谢比我更了解这个领域的人的洞察力

我的要求 我在一个更新面板的页面上有一个按钮

当从jQuery/Javascript函数以编程方式单击按钮时,我需要在ASP.Net web应用程序的代码隐藏中的变量中设置一个值

然后我需要将更改后的变量从代码中传递回页面。此变量的值将决定另一个jQuery/Javascript函数在进一步的用户操作中的行为

我无法使用隐藏字段,因为它们在更新面板内被我的
OnUnload
方法重置

我的问题 如果我在更新面板内单击按钮后将变量填充到代码中,是否有一种简单而快速的方法可让此更新面板外的jQuery/Javascript函数从会话中检索变量?这可能吗

我的用户界面代码

<asp:UpdatePanel ID="UpdatePanel1" runat="server" OnUnload="UpdatePanel_Unload">
<ContentTemplate>

 <asp:Button ID="btnSendMeTheField" runat="server" style="visibility: hidden; display: none;"  OnClick="btnSendMeTheField_Click"/>

</ContentTemplate>
</asp:UpdatePanel>
Protected Sub btnSendMeTheField_Click(sender As Object, e As EventArgs) Handles btnSendMeTheField.Click
                Dim parsedObjectId As String = ""
                parsedObjectId = "1000"
                Session("objectId") = parsedObjectId
End Sub

我将使用jqueryajax和HttpHandler。确保HttpHandler实现IRequiresessionState以访问当前会话


我会使用Newtonsoft.Json,而不是标准的Microsoft库来转换Json。

好的,这是一个从现有项目改编的示例。名称已更改以保护无辜者:)

首先,HttpHandler。这将响应一个特定的jqueryajax请求,该请求请求会话变量的值。在返回JSON时,创建一个简单的对象来返回结果(返回类型当然可以根据需要复杂):-

(再次为这是C#而不是VB.NET表示歉意;我已经尽力让它尽可能简单明了)

为了简单起见,将HttpHandler添加到web项目中。您应该下载最新版本的Newtonsoft.Json,并首先添加对它的引用。此处理程序只需获取请求“sessionVariableName”参数中传递的任何内容,尝试检索该名称的会话变量并以字符串形式返回其值:-

[WebService(Namespace = "http : / /  namespace not important for your test")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Handler : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{
    public bool IsReusable { get { return false; } }

    public void ProcessRequest(HttpContext context)
    {
        string json = string.Empty;

        try
        {
            if (!string.IsNullOrEmpty(context.Request["sessionVariableName"]))
            {
                string sessionVariableName = context.Request["sessionVariableName"];

                if (context.Session[sessionVariableName] != null)
                {
                    var response = new ResponseItem(context.Session[sessionVariableName].ToString());
                    json = Newtonsoft.Json.JsonConvert.SerializeObject(response);
                }
            }
        }
        catch (Exception ex)
        {
            // you might want to create an "Error" type to return as JSON here
        }

        context.Response.Write(json);
    }
}
您需要在web.config中注册处理程序;我假设您正在使用IIS7或更高版本:-

  <system.webServer>
.
.
.
    <handlers>
      <!-- Custom HTTP handlers -->
      <add name="Handler" preCondition="integratedMode" verb="*" path="Handler.ashx" type="YourProject.YourNamespace.Handler, YourProject" />
处理结果的回调方法:-

function handleResult(result)
{
    var sessionItem = eval(result);
    $("#txtResponse").text(sessionItem.SessionVariable);
}
要测试这一点,请键入您知道应用程序中存在的会话变量的名称;处理程序应该返回它,回调函数将把内容写入txtResponse


抱歉,如果这是一个很长的例子;如果您需要更多帮助,请告诉我。

只有一种方法。Ajax请求。请记住,更新面板使用ajax请求,因此您可以通过更新面板将该数据作为html属性发送回,然后使用jquery访问它。感谢您的快速回复。我马上查。你知道有什么好的例子吗?不知道,我个人不会使用ajax请求,因为它可能是另外一个不需要的请求。见鬼,我会将该数据存储为cookie,而不是存储在会话中,以便轻松访问。在这种情况下,我不能真正使用cookie,因为如果浏览器阻止cookie,系统将无法运行。我会看起来像是崩溃了。但是再次感谢你的帮助。我很感激。你知道,会话依赖于cookies,对吗?我猜你正在url中使用会话令牌。谢谢你。我现在正在阅读Microsoft文档。只是好奇你为什么建议添加HttpHandler。我可能会在阅读时找到答案,但我想听听你对它的看法。不客气:)我会选择这种方法,因为它比UpdatePanel精简得多,UpdatePanel在每次部分回发时都会在页面上发布ViewState,而不像向处理程序发布那样高效。我想,为了更好的结果,不需要太多的开发工作。如果你有一个,那就太好了。你是说替换UpdatePanel?我不确定是否可以在本例中,我将在UpdatePanel中嵌入一个reportviewer,以在单击该按钮后处理报告的刷新。但我会尝试你提供的任何东西。再次感谢。不,如果UpdatePanel已经存在并且正在运行,则不需要更换它。您可以在同一页面上使用另一种Ajax方法。我将收集一个样本并将其作为答案发布。再次感谢您的帮助。这是一个漫长而艰难的项目,它是最后几个错误:)所以你不要浪费你的时间,这里是我的完整代码和更一般的问题。我问你的问题是因为有人给我指出了这个方向。但这是总体问题。谢谢我会深入研究,试着从中学习一些东西。谢谢你花时间帮忙。我会让你知道这是怎么回事!再次感谢。我在这里学到了很多好的建议,供将来参考。所以在最后,我结束了一个有点快速的黑客,因为我没有时间了,扔了一个冰雹玛丽,它工作了!最后,我在清除数据的OnUnload函数的末尾设置了一个asp:hidden字段。我只是没时间了。再一次,我在这里学到了一些好东西,谢谢你花时间来帮助我。
<div>
    <asp:TextBox ID="txtSessionVariableName" runat="server" ClientIDMode="Static" />
    <asp:TextBox ID="txtResponse" runat="server" ClientIDMode="Static" /> 
    <input type="button" value="click me" onclick="javascript::CallHandler()" />
</div>    
function CallHandler()
{
    $.getJSON("Handler.ashx", 
     {
             "sessionVariableName": $("#txtSessionVariableName").val()
     },
     handleResult);
}
function handleResult(result)
{
    var sessionItem = eval(result);
    $("#txtResponse").text(sessionItem.SessionVariable);
}