繁体   English   中英

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

[英]Session Variable lost in 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;
        }
 <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>

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

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而不是更改Action。

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

希望它将解决您的问题。

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

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

由于会话状态值是通过AJAX调用设置的,因此有必要在AJAX回调成功后防止使用preventDefault()触发锚链接的默认操作,并重定向到Time Index操作方法:

锚标记

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

jQuery的

$('#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")";
        }
    });
});

如果要使用香草JS,请将此行放入SetTraineeModel()函数中(不要忘记首先为锚链接设置id属性):

document.getElementById('time').addEventListener('click', function(e) {
    e.preventDefault();
}

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

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

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

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

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

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

请参阅此帖子以获取更多详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM