[英]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/Index
和SetTraineeModel
时。 似乎在设置会话之前已加载/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.