如何访问会话变量并在javascript中设置它们?


81

在后台代码中,我设置Session了一些数据。

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

问题是如何在javascript中获取会话值(在我的示例中为“示例数据”)并设置Session["usedData"]一个新值?


3
请说明它是ASP.Net MVC还是Webforms。如果是MVC,则可以直接通过javascript访问它。如果是网络表单,则可以临时添加到ViewState []
Fendy 2013年

我正在使用WebForms,为什么不能访问Session变量并为其设置值?
Mehmet Ince 2013年

1
不太熟悉WebForms,对我来说,直接访问WebForm中的Session是很新的(尽管这很可能是错误的做法)。会话位于服务器端(webserver / iis),而javascript位于客户端(浏览器)。您需要向Web服务器发出特定请求以触发会话更改。简而言之,您可以使用ajax(使用jQuery实现更简单的实现)和网络服务从javascript更新会话。
Fendy

Answers:


61

使用Java脚本访问和分配会话变量:

使用Javascript分配ASP.NET会话变量:

 <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>

6
我完全尝试过您的代码,访问代码后得到的输出为+ userName +
Rajshekar Reddy

23
这个答案是行不通的。调用SetUserName方法不会调用服务器来访问Session对象
mcintyre321

3
答案仍然无法发挥作用。我认为答案需要重新审查
Heemanshu Bhalla

1
@HeemanshuBhalla实际上,答案是令人反感的,因为访问部分的工作原理很吸引人。尚未检查“分配”部分。
艾哈迈德·马勒基

4
“正在访问”部分起作用。但请注意:在“创建”页面上只会分配一次。呈现JavaScript时,服务器会分配值。您可以使用pagelaad()在部分postpack上重新执行JavaScript,但是如果您的回发更改了,则新的sessionVariable将不会分配给JavaScript。它只会重用旧的。
DaniDev '16

27

您不能Session直接在JavaScript中访问。

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


2
不对,您还记得考试吗?JS中的sessionStorage;)。
mattytommo

哈哈-我遇到了localStorage问题-以防万一用户返回页面!;)
达伦(Darren

这种方法存在风险,因为用户可以使用浏览器开发人员工具轻松更改隐藏字段的值。
艾哈迈德·马勒基

4
@AhmadM-这就是为什么还要在服务器上进行验证的原因。这样做可以防止间接对象引用攻击。
达伦(Darren)

13

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

试试这个

var sessionValue = '<%=Session["usedData"]%>'

谢谢,这很好用:)但是我还要设置会话值,这可能吗?
Mehmet Ince

@MehmetInce,要设置会话值,您可以通过发布或获取值将该值发送到服务器,并让服务器处理该请求。没有什么可以阻止您通过ajax执行此请求。
Ash Burlaczenko 2013年

1
@AshBurlaczenko您能否为此提供一个示例示例。这将有很大帮助
Rajeev Kumar

1
但是,如何使用Javascript将值分配给会话变量?
SHEKHAR SHETE

9

假设您的意思是“客户端JavaScript”-那么您至少不能直接这样做。

会话数据存储在服务器上,因此如果不与服务器进行通信,客户端代码将看不到它。

要访问它,您必须发出HTTP请求并让服务器端程序修改/读取并返回数据。


如果我无法直接访问,那么我比较懒惰的机会是使用http request :(
Mehmet Ince

4

将值分配给代码隐藏文件中的隐藏字段。像普通的HTML控件一样,在您的JavaScript中访问此值。


易于访问但代码安全性大的一个好点,用户可以使用chrome中的devTool之类的工具来棘手地更改其帐户用户/访问权限,并执行其访问级别所不允许的操作
StudioX

2

您无法从中设置会话端会话变量Javascript。如果要做到这一点,你需要创建一个AJAX POST到上更新该服务器但如果汽车的选择是一个重大的事件很可能就是更容易POST这一点。


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>


1

您还可以在属性中设置变量,然后从js调用它:

在服务器端:

Protected ReadOnly Property wasFieldEditedStatus() As Boolean
    Get
        Return If((wasFieldEdited), "true", "false")
    End Get
End Property

然后在javascript中:

alert("The wasFieldEdited Value: <%= wasFieldEditedStatus %>" );

1

我一直在寻找解决此问题的方法,直到找到一个非常简单的访问会话变量的方法,并假设您在服务器端使用了.php文件。希望它能回答部分问题:

访问会话值

<script type="text/javascript">        
    var value = <?php echo $_SESSION['key']; ?>;
    console.log(value);
</script>

编辑:下面的更好的示例,您可以在“代码空间”选项卡上尝试phpfiddle.org

<!DOCTYPE html>
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <?php
    $_SESSION['key'] = 10;
    $i = $_SESSION['key'];
  ?>
 </head>
 <body>
  <p id="affichage">hello</p>

  <script type="text/javascript">
    var value =  <?php echo $i; ?>;
    $("#affichage").html(value);   
  </script>

 </body>
</html>

设置会话值

给它传递一个变量,无论您想要什么。例如,

$you = 13;
$_SESSION['user_id'] = $you;

这应该工作,但不进行测试。


您可能忘记了替换“密钥”
Matthieu

你好@Matthieu海报询问的是asp.net会话,而不是php会话
SHEKHAR SHETE

我应该删除我的帖子吗?
马修(Matthieu)

1

这是一个作弊,但是您可以执行此操作,将该值作为参数发送到服务器端

<script>
var myVar = "hello"
window.location.href = window.location.href.replace(/[\?#].*|$/, "?param=" + myVar); //Send the variable to the server side
</script>

然后从服务器端检索参数

string myVar = Request.QueryString["param"];
Session["SessionName"] = myVar;

希望这可以帮助


1

这对我有用。Javascript具有此功能。

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

后面的C#代码具有此功能-可以将其放在母版页上,以便在每次页面更改时重置var。

        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);

0

我用我的.php文件将必需的文件放入会话中

$ _SESSION ['name'] = $ phparray [“ name”]; $ ajaxoutput ['name'] = $ phparray [“ name”];

在我使用的.js文件中

sessionStorage.setItem(“ name”,ajaxreturnedarray [“ name”]));

我使用了这个

var myName = sessionStorage.getItem(“ name”);

在其他.js文件或同一.js文件中

如果我保持原样,即使您注销,它也将始终返回相同的值。所以注销时我做了

sessionStorage.setItem(“ name”,“”);

使用此我清空局部变量。我在单页网站登录/注销会话中使用了此过程。我希望这种方式对您有用,因为它对我有用。请告诉我您的经历。


0

要在页面创建后从服务器修改会话数据,您将需要使用AJAX甚至JQuery来完成工作。两者都可以与服务器建立连接以修改会话数据并从该连接获取返回的数据。

<?php
session_start();
$_SESSION['usedData'] = "Some Value"; //setting for now since it doesn't exist
?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Modifying PHP Session Data</title>
        <script type='text/javascript'>
            var usedData = '<?php echo $_SESSION['usedData']; ?>';
            var oldDataValue = null;

            /* If function used, sends new data from input field to the
               server, then gets response from server if any. */

            function modifySession () {
                var newValue = document.getElementById("newValueData").value;

                /* You could always check the newValue here before making
                   the request so you know if its set or needs filtered. */

                var xhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

                xhttp.onreadystatechange = function () {
                    if (this.readyState == 4 && this.status == 200) {
                        oldDataValue = usedData;
                        usedData = this.responseText; //response from php script
                        document.getElementById("sessionValue").innerHTML = usedData;
                        document.getElementById("sessionOldValue").innerHTML = oldDataValue;
                    }
                };

            xhttp.open("GET", "modifySession.php?newData="+newValue, true);
            xhttp.send(); 
            }
        </script>
    </head>
    <body>
        <h1><p>Modify Session</p></h1>

        Current Value: <div id='sessionValue' style='display:inline'><?php echo $_SESSION['usedData']; ?></div><br/>
        Old Value: <div id='sessionOldValue' style='display:inline'><?php echo $_SESSION['usedData']; ?></div><br/>

        New Value: <input type='text' id='newValueData' /><br/>
        <button onClick='modifySession()'>Change Value</button>
   </body>
</html>

现在,我们需要制作一个名为ModifySession.php的小型php脚本,以更改会话数据并在必要时将数据回发。

<?php
session_start();
$_SESSION['usedData'] = $_GET['newData']; //filter if necessary
echo $_SESSION['usedData']; // Post results back if necessary
?>

通过使用PHP / AJAX通过服务器端修改会话,可以达到所需的结果。


0

我可以通过简单的URL参数和自动刷新来解决类似的问题。

您可以从URL参数获取值,对它们进行任何操作,然后只需刷新页面即可。

HTML:

<a href=\"webpage.aspx?parameterName=parameterValue"> LinkText </a>

C#:

string variable = Request.QueryString["parameterName"];
if (parameterName!= null)
{
   Session["sessionVariable"] += parameterName;
   Response.AddHeader("REFRESH", "1;URL=webpage.aspx");
}

-1
<?php
    session_start();
    $_SESSION['mydata']="some text";
?>

<script>
    var myfirstdata="<?php echo $_SESSION['mydata'];?>";
</script>

提供的答案被标记为低质量。这里有一些提示如何回答的?
Guilherme Lemmi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.