我正在使用.net MVC 4构建Web应用程序。
我有ajax表单来编辑数据。
如果用户空闲15分钟,它将使用户的会话到期。当用户单击编辑按钮时会发生这种情况,它会在部分内容中加载登录页面,因此现在会话到期。
编辑链接 - cshtml代码
@Ajax.ActionLink("Edit", MVC.Admin.Material.ActionNames.TagEditorPanel, MVC.Admin.Material.Name, new { isView = "false", id = Model.ID.ToString() }, new AjaxOptions { HttpMethod = "GET", UpdateTargetId = "materialTagBox", InsertionMode = InsertionMode.Replace }, new { @class = "editlinks" })
控制器/操作代码
[Authorize]
public virtual ActionResult TagEditorPanel(bool isView, int id)
{
//do something
return PartialView(MVC.Admin.Material.Views._tag, response);
}
的Web.config
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
我明白为什么会这样。我不知道如何解决它。我想阻止它,我想直接将用户重定向到登录页面。我怎样才能做到这一点?
非常感谢.. !!!
答案 0 :(得分:11)
也许是一个hacky的答案,但您可以将表单身份验证中的重定向位置更改为使用javascript将窗口位置设置为登录页面的页面。
Web Config
<authentication mode="Forms">
<forms loginUrl="~/Account/RedirectToLogin" timeout="2880" />
</authentication>
帐户控制器
public ActionResult RedirectToLogin()
{
return PartialView("_RedirectToLogin");
}
_RedirectToLogin查看
<script>
window.location = '@Url.Action("Login", "Account")';
</script>
答案 1 :(得分:1)
问题是您的呼叫被[Authorize]
拦截并在调用操作方法代码之前发送登录页面。解决此问题的一种方法是创建自定义操作筛选器以检查超时并执行硬重定向到登录页面。以下帖子有一个很好的写作,可以帮助您创建和注册过滤器
http://www.codeblockdrive.com/2012/12/mvc-custom-filters-session-timeout.html
祝你好运
答案 2 :(得分:1)
您可能想查看此(类似)问题的答案。
ASP.NET MVC Partial view ajax post?
基本上它说你应该避免对由于这个和其他问题而可能重定向的函数进行ajax调用。
您可以通过在函数中手动授权/检查过期,然后返回可应用于整个页面的重定向信息来避免您遇到的问题。
我使用过这种方法,效果很好。
答案 3 :(得分:1)
受到kramwens答案的启发,可以避免进行额外的RedirectToLogin视图(和控制器操作),只需将以下内容放在原始的Login视图中:
<script>
if (window.location != '@string.Format("{0}://{1}{2}",Request.Url.Scheme, Request.Url.Authority,Url.Content("~/Account/Login"))')
window.location = '@Url.Action("Login", "Account")';
</script>
这会测试当前的window.location,如果它不符合预期,则会按预期进行设置。 我知道,我的js有点hacky和蹩脚,但它做的工作:)
答案 4 :(得分:0)
我找到部分视图会话过期的简单方法。
Simple One Action创建然后这个视图java脚本windows.load()调用然后url将传递给这个登录页面。
//在Controller one Action Created。
<script type="text/javascript">
window.location = '@Url.Action("Login", "LogIn")';
</script>
Public ActionResult SessionExpire()
{
return View();
}
//在session为null之后重定向从partail视图登录:
return Redirect("~/OrderPlace/Sessionview");
答案 5 :(得分:0)
我的解决方案是尽可能使用一些c#代码。我可以获取控制器和视图名称,检查它们是否应为正确的名称,如果没有重定向到正确的名称。
(WM_COMMAND, IDCANCEL, IDOK)
然后我使用以下内容转到正确的URL:
INT_PTR DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_SYSCOMMAND:
if ((wParam & 0xfff0) == SC_CLOSE) DestroyWindow(hwndDlg);
break;
case WM_COMMAND:
switch (wParam)
{
case MAKEWPARAM(IDOK, BN_CLICKED):
case MAKEWPARAM(IDCANCEL, BN_CLICKED):
// ignore this
break;
....
}
}
....
}