如何从jQuery传递会话参数到ASHX处理程序

3
以下是我的Jquery代码,我想传递Session参数,例如Session ["ID"]。 Jquery调用ASHX页面
所有下面的参数都正常工作,会话参数有一个值,但是如何从Jquery传递会话参数呢?
因此,下面的代码“参数Sessionparameter”应该被替换为Session ["ID"]或类似的内容。我该怎么做?
请建议?
   $('input[name$=btnTab1Save]').click(
             function (e) {
                 // debugger;
                 // AJAX call to the handler
                 $.post(
                    'Consulting.ashx',
                 // data to the handler in the form of QueryString
                    {
                    tab: 'tab1',
                    // id is the second column within the row
                    Ilac_id: prevRow.find('td:eq(0)').text(),
                    ID: SESSION_PARAMATER,
                    begindate: $('input[name$=begindate]').val(),
                    weigth: $('input[name$=weigth]').val(),
                    continue: true,
                    freq: $('input[name$=freq]').val(),
                    reason: $('input[name*=radListreason]:checked').val(),
                    freq2: $('input[name$=radListfreq2]:checked').val(),
                    freetext: $('input[name$=freetext]').val()
                },
                 // callback function
                 // data is the JSON object
                    function (data) {
                        if (data.Success) {
                            // close the tab
                        }
                    },
                    "json"
                );
             });

我可以像这样读取我的参数 Convert.Toint(context.Request.Form["ID"]));

 data.weigth = Convert.ToInt32(context.Request.Form["weigth"]);

我尝试了这个代码:'<%= Session["ID"] .ToString() %>',但它没有起作用...
3个回答

7

如果信息在会话中,ASHX可以直接访问会话内容。

您需要实现IReadOnlySessionState,那么就没问题了。

<% @ webhandler language="C#" class="MyClass" %>

using System;
using System.Web;
using System.Web.SessionState;

public class MyClass: IHttpHandler, IReadOnlySessionState
{
   public bool IsReusable { get { return true; } }

   public void ProcessRequest(HttpContext ctx)
   {
       ctx.Response.Write(ctx.Session["ID"]);
   }
}

@Daok... 谢谢,这个很好用。只是能解释一下为什么我必须将isReusable设置为true吗?在我的代码中它的值是false(从互联网上复制的)...请解释一下这个属性的原因要设为true...谢谢。 - ethem
1
“IsReusable”方法默认设置为true,表示另一个请求是否可以使用IHttpHandler实例。因此,在您的情况下,您可以将其设置为false或true,这并不重要。 - Patrick Desjardins

4

如果不涉及敏感数据,实现这个的方式可以是将Session["ID"]的值写入一个JavaScript变量,然后使用该变量将数据发送到ASHX处理程序。类似以下方式:

var sessionVariable = '<%=HttpContext.Current.Session["ID"].ToString()%>';

然后:

 ID: sessionVariable, // etc ... 

2
如果它不是敏感数据,那么在你的回答中加上“+1”。 - tugberk
2
会话信息存储在URL或COOKIE中。即使未打印在JavaScript中,会话也不应使用敏感信息。 - Patrick Desjardins
1
@Daok “Session should never use sensitive information” 这个说法有点过激;我的意思是,你可以在 Session 中存储敏感和非敏感的数据。例如,为了缓存目的。 - Icarus
;) 你可以尝试“缓存”用户的信用卡信息...但在我看来,会话既不是用于缓存,也不适合存储敏感信息... - Patrick Desjardins
@lcarus/@tugberk:我尝试了,但在处理程序中出现错误:输入字符串格式不正确。当我在调试器(观察)中查看ASHX中的值时,它的值为“<%=HttpContext.Current.Session["ID"].ToString()%>”。因此,它没有传递值,而是将语法代码/编程代码传递给ASHX。 - ethem
@mesut,这对我有效。我在我的Default.aspx页面上执行了以下操作:Session["ID"] = "yadda yadda";,然后在我的着陆页上执行了以下操作:var session = '<%=HttpContext.Current.Session["ID"].ToString()%>';,当我查看我的着陆页源代码时,我看到了这个:var session = 'yadda yadda'; - Icarus

2
需要将会话变量传递给ASHX吗?还是让ASHX能够访问会话变量更好?后者更安全,而且工作量更少。如果只需要读取会话变量,只需添加对IReadOnlySessionState接口的继承即可。如果您希望实际更改它,则可以从其他接口继承,但这应该可以让您朝着正确的方向前进。这里是一个链接:这里
注:已更正链接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接