在我的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;
}
答案 0 :(得分:0)
<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>
并在设置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。