Переменная сеанса по умолчанию соответствует последнему набору - PullRequest
2 голосов
/ 11 декабря 2019

Я знаю, что это плохая практика, как я это делаю, но все же я хотел бы понять, почему это не работает.

У меня есть 3 onclick методы для различных сеток в Javascript:

    $('body').on('click', '#clinician-appointments>tbody>tr>td:not(:last-child):not(:first-child)', function () {
         var id = $(this).closest("tr").children("td.grid__col--id").find("[name=patient-link]").text().trim();
         @{Session["Clinician"] = "opa"};
         location.href = "@Url.Action("Summary", "Patient")" + "/" + id;
             });

    $('body').on('click', '#clinician-current-admissions>tbody>tr>td:not(:last-child):not(:first-child)', function () {
        var id = $(this).closest("tr").children("td.grid__col--id").find("[name=patient-link]").text().trim();
        location.href = "@Url.Action("Summary", "Patient")" + "/" + id;
       @{Session["Clinician"] = "ca"};
            });

    $('body').on('click', '#clinician-diagnostics>tbody>tr>td:not(:last-child):not(:first-child)', function () {
        var id = $(this).closest("tr").children("td.grid__col--id").find("[name=patient-link]").text().trim();
        location.href = "@Url.Action("Summary", "Patient")" + "/" + id;
        @{Session["Clinician"] = "diag"};
            });  

Однако когда я вызываю сессию в C #, это всегда «diag», последний назначается.

Так как они находятся в разных событиях, остальные будут пропущены.

1 Ответ

4 голосов
/ 11 декабря 2019

Поскольку это страница Razor, когда вы делаете:

@{Session["Clinician"] = "diag"};

, она будет выполнена до того, как страница будет отображена в браузере. Таким образом, при загрузке страницы выполняется следующее на стороне сервера в последовательности:

@{Session["Clinician"] = "opa"};
@{Session["Clinician"] = "ca"};
@{Session["Clinician"] = "diag"};

Вопреки вашим ожиданиям, они не выполняются при нажатии насоответствующая сетка, так как это чисто интерактивное событие на стороне клиента.

Я предлагаю вам заменить "@ {Session [" Clinician "] =" ... "};"с помощью ajax-вызова для нового действия контроллера, который устанавливает строку в сеансе. Так что-то вроде этого:

JavaScript:

function Session()
{
}

Session.SetString = function (key, value)
{
    $.post("/Home/SessionString?key=" + key + "&value=" + value);
};

Session.GetString = function (key, successCallback)
{
    $.get("/Home/SessionString?key=" + key, null, function (data, textStatus, jqXHR) { successCallback(data) });
};

$('body').on('click', '#clinician-appointments>tbody>tr>td:not(:last-child):not(:first-child)', function () {
     var id = $(this).closest("tr").children("td.grid__col--id").find("[name=patient-link]").text().trim();
     Session.SetString("Clinician", "opa");
     location.href = "@Url.Action("Summary", "Patient")" + "/" + id;
});

Контроллер (для .NET Core):

    /// <summary>
    /// Sets a value in the user's session.
    /// </summary>
    /// <param name="key">The key for the value.</param>
    /// <param name="value">The value.</param>
    [HttpPost]
    public IActionResult SessionString(string key, string value)
    {
        HttpContext.Session.SetString(key, value);
        return new JsonResult(null);
    }

    /// <summary>
    /// Get a value from the user's session.
    /// </summary>
    /// <param name="key">The key for the value.</param>
    /// <returns>The value.</returns>
    [HttpGet]
    public IActionResult SessionString(string key)
    {
        string value = HttpContext.Session.GetString(key);
        return new JsonResult(value);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...