会话变量在Asp.net MVC中丢失

时间:2018-09-27 05:08:17

标签: c# jquery .net asp.net-mvc

在我的AP.NET MVC应用程序中,我正在通过JQuery设置会话变量,如下所示。

HTML

 <a href="/Time" onclick="SetTraineeModel({{userId}})"><img src='../Content/themes/base/img/icon-arrow-table-view.png'></a>

abc.js

function SetTraineeModel(userId) {
    $.ajax({
        url: $('#rootUrl').val() + "Notifications/SetTraineeModel",
        async: false,
        data: {
            Id: userId
        },
        success: function (data) {
        }
    })
}

已在Notifications Controller的SetTraineeModel方法中成功设置了会话变量。

但是,在单击处理程序之后单击href方法时,变量为null。即使用“时间控制器索引”方法。

我不确定在这种情况下为什么会丢失会话变量?

注意:上面的{{userId}}来自handlebars.js模板。

这是我的Controller方法:

 public void SetTraineeModel(string Id)
        {
            var model = new TraineeModel();
            model.CurrentTraineeId = Id;
            HttpContext.Current.Session["CurrentTrainee"] = model;
        }

3 个答案:

答案 0 :(得分:0)

 <a href="/Time" onclick="SetTraineeModel({{userId}})"><img src='../Content/themes/base/img/icon-arrow-table-view.png'></a>

在同时呼叫/Time/IndexSetTraineeModel时。似乎您/Time/Index页在设置会话之前已加载。

请尝试这个。

<a href="#" onclick="SetTraineeModel({{userId}})"><img src='../Content/themes/base/img/icon-arrow-table-view.png'></a>

并在设置Time/Index后重定向到SetTranineeModel内部的Session

public ActionResult SetTraineeModel(string Id)
{
    var model = new TraineeModel();
    model.CurrentTraineeId = Id;
    HttpContext.Current.Session["CurrentTrainee"] = model;
    return RedirectToAction("Index", "Time", null);
}

替代解决方案

<a href="#" onclick="SetTraineeModel({{userId}})"><img src='../Content/themes/base/img/icon-arrow-table-view.png'></a>

然后,您无需更改操作,就可以使用JavaScript重定向到/Time/Index

function SetTraineeModel(userId) {
$.ajax({
    url: $('#rootUrl').val() + "Notifications/SetTraineeModel",
    async: false,
    data: {
        Id: userId
    },
    success: function (data) {
        location.href='@Url.Action("Index","Time",null)';
    }
});
}

希望能解决您的问题。

答案 1 :(得分:0)

此设置将首先在/Time/Index内部调用href操作,然后再执行AJAX,因此具有相应键的会话状态仍为空值:

<a href="/Time" onclick="SetTraineeModel({{userId}})"><img src='../Content/themes/base/img/icon-arrow-table-view.png'></a> 

由于会话状态值是通过AJAX调用设置的,因此必须阻止A preventDefault()触发锚链接的默认操作,并在AJAX成功后重定向到Index的{​​{1}}操作方法回调:

锚标记

Time

jQuery

<a href="#" id="time"><img src='../Content/themes/base/img/icon-arrow-table-view.png'></a>

如果要使用普通JS,请将此行放在$('#time').click(function (e) { e.preventDefault(); // assign userId with unencoded value var userId = {{{userId}}}; $.ajax({ url: $('#rootUrl').val() + "Notifications/SetTraineeModel", async: false, data: { Id: userId }, success: function (data) { location.href = "@Url.Action("Index", "Time")"; } }); }); 函数中(不要忘记首先为锚定链接设置SetTraineeModel()属性):

id

答案 2 :(得分:0)

这里的问题是因为SessionStateBehaviour。控制器具有属性

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]

处理并发请求并减少多次ajax调用所花费的时间。

即使控制器将SessionStateBehaviour设置为只读,它仍允许在控制器操作中更新会话。根据文档here,此行为是设计使然。

我通过将控制器Action移至其他控制器来解决此问题。

我知道这个问题已被讨论过多次。但是我找不到任何与我直接与SessionStateBehaviour有关的问题的帖子。因此,将此线程留在这里,希望对您有所帮助。

有关更多详细信息,请参阅此post