Як отримати доступ до змінних сеансу та встановити їх у javascript?


83

У коді позаду я встановлюю Sessionз деякими даними.

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

І питання полягає в тому, як я можу отримати значення Session (у моєму прикладі; "зразок даних") у javascript і встановити Session["usedData"]з новим значенням?


3
Будь ласка, вкажіть, чи це ASP.Net MVC чи веб-форми. Якщо MVC, ви можете отримати доступ до нього безпосередньо в javascript. Якщо веб-форми, ви можете тимчасово додати до ViewState []
Фенді

Я використовую WebForms, чому я не можу отримати доступ до змінної Session і встановити для неї значення?
Mehmet Ince

1
Не надто через WebForms, для мене є новим прямий доступ до сеансу в WebForm (хоча це, швидше за все, погана практика). Сеанс знаходиться на стороні сервера (веб-сервер / iis), а javascript - на стороні клієнта (браузер). Вам потрібен конкретний запит до веб-сервера, щоб викликати зміни під час сеансу. Коротше кажучи, ви можете оновити сеанс із javascript за допомогою ajax (jQuery для спрощення реалізації) та веб-сервісу.
Фенді

Відповіді:


60

Доступ та призначення змінної сеансу за допомогою Javascript:

Призначення змінної сеансу ASP.NET за допомогою Javascript:

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

Доступ до змінної сеансу ASP.NET за допомогою Javascript:

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

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

6
Я спробував точно + userName +
ввести

23
Ця відповідь не спрацює. Виклик методу SetUserName не збирається робити дзвінок на сервер для доступу до об'єкта Session
mcintyre321

3
відповідь не працює, вона все ще отримує голоси за. я думаю, що відповідь потрібно переглянути
Хеманшу Бхалла

1
@HeemanshuBhalla Насправді відповідь полягає в тому, що голоси "за" призводять до того, що частина доступу працює як шарм. Хоча ще не перевіряв присвоювальну частину.
Ахмад Малекі,

4
Робота частини «Доступ». Але ВЕЛИКИЙ застереження: він буде призначений лише один раз при створенні сторінки. Сервер призначає значення при отриманні JavaScript. Ви можете повторно виконати JavaScript на частковому поштовому пакеті за допомогою pagelaad (), але якщо ваш зворотний зв’язок зміниться, нова sessionVariable не буде призначена JavaScript. Він просто повторно використає старий.
DaniDev

27

Ви не можете отримати доступ Sessionбезпосередньо в JavaScript.

Ви можете створити приховане поле та передати його на свою сторінку, а потім скористатися JavaScript для отримання об’єкта через document.getElementById


3
Неправда, ви пам’ятаєте на іспиті? sessionStorage в JS;).
mattytommo

Ха-ха - я отримав запитання localStorage - про всяк випадок, якщо користувач повернеться на сторінку! ;)
Даррен

Цей підхід має ризик, оскільки користувач може легко змінити значення прихованого поля за допомогою інструментів розробника браузера.
Ахмад Малекі

4
@AhmadM - ось чому ви також перевіряєте сервер. Це дозволить запобігти непрямій атаці на посилання на об’єкт.
Даррен,

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"] ?? "";
      }
 }

Для отримання значень сеансу, як сказали Шехар та Радєєв

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

Сподіваюся, це допомагає.


12

Спробуйте це

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

дякую, це чудово працює :) але я хочу встановити також значення сеансу, чи можливо це?
Мехмет Індже

@MehmetInce, щоб встановити значення сеансу, ви повинні надіслати це значення на сервер поштою або отримати та змусити сервер обробляти запит. Вам ніщо не заважає виконати цей запит через ajax.
Еш Бурлаценко

1
@AshBurlaczenko Не могли б ви опублікувати зразок прикладу для цього. Це було б дуже
корисно

1
Але як ви присвоїте значення змінній сеансу за допомогою Javascript?
SHEKHAR SHETE

10

Припускаючи, що ви маєте на увазі "JavaScript на стороні клієнта" - тоді ви не можете, принаймні не безпосередньо.

Дані сеансу зберігаються на сервері, тому код на стороні клієнта не бачить їх без зв’язку із сервером.

Щоб отримати до нього доступ, ви повинні зробити HTTP-запит і мати програму на стороні сервера, яка модифікує / читає та повертає дані.


Якщо я не можу отримати безпосередній доступ, мій шалений шанс - використати http-запит :(
Mehmet Ince

4

Присвоїти значення прихованому полю у файлі із кодом. Отримайте доступ до цього значення у своєму javascript як до звичайного елемента керування HTML.


хороший момент, щоб мати легкий доступ, але велика проблема для безпеки коду, користувач може хитро змінити користувача / доступ до свого облікового запису, використовуючи інструменти, такі як devTool у chrome, і робити те, що заборонено його рівнем доступу
StudioX

2

Ви не можете встановити змінні сеансу на стороні сеансу з Javascript. Якщо ви хочете це зробити, вам потрібно створити AJAX 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>

2

Якщо ви хочете прочитати значення сеансу в javascript, цей код допоможе вам.

<script type='text/javascript'> var userID='@Session["userID"]'; </script>


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 плакат запитує про сесію 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

Щоб змінити дані сеансу з сервера після створення сторінки, вам потрібно буде використовувати 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>

Тепер нам потрібно зробити невеликий php-скрипт, який називається modifySession.php, щоб внести зміни до даних сеансу та повернути дані, якщо це необхідно.

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

Це повинно досягти бажаних результатів, які ви шукаєте, модифікуючи сеанс через сторону сервера за допомогою PHP / AJAX.


1

Ось, що у мене вийшло. 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);
        }

Додайте цей код до кнопки, щоб підтвердити зміну назви деп.

alert(deptname);

0

я використав свій файл .php, щоб розмістити необхідне на сеансах

$ _SESSION ['name'] = $ phparray ["name"]; $ ajaxoutput ['name'] = $ phparray ["name"];

у моєму файлі .js, який я використовував

sessionStorage.setItem ("name", ajaxreturnedarray ["name"]);

і я отримав це за допомогою

var myName = sessionStorage.getItem ("ім'я");

в інших файлах .js або в цих же файлах .js

якщо я збережу його таким, яким воно є, воно буде повертатися постійно однаковим, навіть якщо ви вийшли з системи. так що під час виходу я зробив

sessionStorage.setItem ("ім'я", "");

використовуючи цю локальну змінну, яку я звільнив. я використовував цей процес у сеансах входу / виходу з веб-сайту на одній сторінці. Я сподіваюся, цей спосіб спрацює для вас, тому що він спрацював для мене. PLZ, дайте мені знати ваш досвід.


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

-1

Можливо, певний пробіг при такому підході. Здається, це повертає дату до змінної сеансу. Рядок, який він повертає, відображає дату JavaScript, але коли я намагаюся маніпулювати рядком, він відображає код JavaScript.

ob_start();
?>
<script type="text/javascript">
    var d = new Date();
    document.write(d);
</script>
<?
$_SESSION["date"]  = ob_get_contents();
ob_end_clean();
echo $_SESSION["date"]; // displays the date
echo substr($_SESSION["date"],28); 
// displays 'script"> var d = new Date(); document.write(d);'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.