如何在JavaScript中访问和设置Session变量?

96

在代码后台,我使用Session存储了一些数据。

Session["usedData"] = "sample data";

我该如何在JavaScript中获取Session值(例如:"sample data"),并将Session["usedData"]设置为新值?


3
请说明是ASP.Net MVC还是Webforms。如果是MVC,您可以直接访问JavaScript。如果是Webforms,则可以将其暂时添加到ViewState[]中。 - Fendy
我正在使用WebForms,为什么我无法访问Session变量并设置它的值? - Mehmet Ince
1
不要太过于依赖WebForms,对我来说在WebForm中直接访问Session是新的(尽管这很可能是一种不好的做法)。Session位于服务器端(webserver / iis),而javascript位于客户端(浏览器)。你需要发送特定请求到webserver来触发session的更改。简而言之,你可以使用ajax(使用jQuery进行更简单的实现)和webservice从javascript更新session。 - Fendy
18个回答

72

使用Javascript访问和赋值Session变量:

使用Javascript分配ASP.NET Session变量:

 <script type="text/javascript">
function SetUserName()
{
    var userName = "Shekhar Shete";
    '<%Session["UserName"] = "' + userName + '"; %>';
     alert('<%=Session["UserName"] %>');
}
</script>

使用Javascript访问ASP.NET Session变量:

<script type="text/javascript">
    function GetUserName()
    {

        var username = '<%= Session["UserName"] %>';
        alert(username );
    }
</script>

8
我尝试了你的代码,并在我的代码中访问它时得到的输出是 + userName + - Rajshekar Reddy
26
这个答案行不通。调用SetUserName方法不会向服务器发出请求以访问Session对象。 - mcintyre321
3
答案仍未解决问题,但仍在获得赞同。我认为答案需要进行审核。 - Heemanshu Bhalla
1
@HeemanshuBhalla 实际上答案得到了赞,因为访问部分运行良好。尚未检查分配部分。 - Ahmad Maleki
4
"Accessing" 部分有效。但有个很大的限制:这个变量只在页面创建时被分配一次。服务器在渲染 JavaScript 时分配这个值。你可以在部分页面回传中使用 pagelaad() 重新执行 JavaScript,但如果你的回传改变了新的 sessionVariable,它不会被分配给 JavaScript。它仅仅会重用旧的变量。 - DaniDev
显示剩余7条评论

30

在 JavaScript 中不能直接访问 Session

您可以创建一个隐藏字段,并将其传递给您的页面,然后使用 JavaScript 通过 document.getElementById 检索对象。


3
不对,你还记得考试时的 sessionStorage 在 JS 中的应用吗?;) - Mathew Thompson
哈哈 - 我得到了localStorage的问题 - 以防用户返回页面!;) - Darren
这种方法存在风险,因为用户可以使用浏览器开发工具轻松更改隐藏字段的值。 - Ahmad Maleki
4
@AhmadM - 这也是为什么你需要在服务器端进行验证的原因。这样做可以防止间接对象引用攻击。 - Darren

16

试试这个:

var sessionValue = '<%=Session["userData"]%>';

谢谢,这很好用 :) 但我也想设置会话值,这可行吗? - Mehmet Ince
@MehmetInce,要设置Session值,您需要通过POST或GET将值发送到服务器,并让服务器处理请求。没有什么阻止您通过ajax进行此请求。 - Ash Burlaczenko
1
@AshBurlaczenko,您能否提供一个示例样例呢?这将会非常有帮助。 - Rajeev Kumar
1
但是,您将如何使用Javascript为会话变量分配值? - SHEKHAR SHETE
如果我在file.js文件中的一个函数$button.click中这样做,我得到的只是赋值的纯字符串。自2013年以来,JavaScript有没有发生一些变化? - bomben

15

Javascript无法直接设置会话值。

为了从Javascript设置会话值,我使用以下ajax调用。

在线查看

在ASPx文件或HTML中,

 <script type="text/javascript">
 $(function(){
   //Getting values from session and saving in javascript variable.
   // But this will be executed only at document.ready.
   var firstName = '<%= Session["FirstName"] ?? "" %>';
   var lastName = '<%= Session["LastName"] ?? "" %>';

   $("#FirstName").val(firstName);
   $("#LastName").val(lastName);

   $('Button').click(function(){
     //Posting values to save in session
     $.post(document.URL+'?mode=ajax', 
     {'FirstName':$("#FirstName").val(),
     'LastName':$("#LastName").val()
     } );
   });

 });

在服务器端,

protected void Page_Load(object sender, EventArgs e)
 {
      if(Request.QueryString["mode"] != null && Request.QueryString["mode"] == "ajax")
      {
        //Saving the variables in session. Variables are posted by ajax.
        Session["FirstName"] = Request.Form["FirstName"] ?? "";
        Session["LastName"] = Request.Form["LastName"] ?? "";
      }
 }

如Shekhar和Rajeev所说,要获取会话值。

var firstName = '<%= Session["FirstName"] ?? "" %>';

希望这可以帮到你。


12
假设您的意思是“客户端JavaScript”-则您无法直接访问会话数据。会话数据存储在服务器上,因此客户端代码未经与服务器通信就无法查看它。要访问它,您必须发出HTTP请求,并且需要一个服务器端程序来修改/读取和返回数据。

如果我无法直接访问,那么我的最后一招就是使用HTTP请求 :( - Mehmet Ince

5
在代码后端文件中为隐藏字段分配值。像普通HTML控件一样在JavaScript中访问该值。

1
方便用户访问是一个好的点,但编写安全代码是一个大问题。用户可以使用像Chrome中的devTool这样的工具巧妙地更改他的帐户用户/访问,并执行超出其访问级别的操作。 - Saghachi

2

首先在后台代码中创建一个方法来设置会话:

 [System.Web.Services.WebMethod]
 public static void SetSession(int id)
 {
     Page objp = new Page();
     objp.Session["IdBalanceSheet"] = id;
 }

然后从客户端调用它:

function ChangeSession(values) {
     PageMethods.SetSession(values);
     }

您应该将EnablePageMethods设置为true:

<asp:ScriptManager EnablePageMethods="true" ID="MainSM" runat="server" ScriptMode="Release" LoadScriptsBeforeUI="true"></asp:ScriptManager>

2

您无法通过Javascript设置会话端的会话变量。如果您想要这样做,您需要创建一个AJAXPOST来在服务器上更新它,尽管如果选择一辆汽车是一个重大事件,这可能更容易地完成 POST


2
如果你想在javascript中读取Session值,这段代码可以帮助你。 <script type='text/javascript'> var userID='@Session["userID"]'; </script> 请注意,保留了HTML标签。

2

以下是对我有用的解决方案。 Javascript有这个功能。

<script type="text/javascript">
var deptname = '';
</script>

C#代码后台有这个功能 - 它可以放在母版页上,以便在每次页面更改时重置变量。"最初的回答"。
        String csname1 = "LoadScript";
        Type cstype = p.GetType();

        // Get a ClientScriptManager reference from the Page class.
        ClientScriptManager cs = p.ClientScript;

        // Check to see if the startup script is already registered.
        if (!cs.IsStartupScriptRegistered(cstype, csname1))
        {
            String cstext1 = funct;
            cs.RegisterStartupScript(cstype, csname1, "deptname = 'accounting'", true);
        }
        else
        {
            String cstext = funct;
            cs.RegisterClientScriptBlock(cstype, csname1, "deptname ='accounting'",true);
        }

在按钮点击事件中添加此代码以确认 deptname 已更改。


alert(deptname);

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