关于ajax:会话期满时,.Net MVC部分视图加载登录页面

.Net MVC Partial View load login page when session expires

我正在使用.net MVC 4构建Web应用程序。

我有一个ajax表单来编辑数据。

enter image description here

如果用户闲置15分钟,它将使用户会话期满。 如果发生这种情况,如果用户单击"编辑"按钮,则会将登录页面加载到部分内容中,因此当前会话将过期。

enter image description here

编辑链接-CSHTML代码

1
@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" })

控制器/动作代码

1
2
3
4
5
6
[Authorize]
public virtual ActionResult TagEditorPanel(bool isView, int id)
{
   //do something
   return PartialView(MVC.Admin.Material.Views._tag, response);
}

Web.config

1
2
  <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>

我知道为什么会这样。 我不知道该怎么解决。 我想阻止它,并且我想将用户直接重定向到登录页面。 我该如何实现?

提前致谢..!!!


也许是个错误的答案,但是您可以将表单身份验证中的重定向位置更改为一个页面,该页面使用javascript将窗口位置设置为登录页面。

Web配置

1
2
  <forms loginUrl="~/Account/RedirectToLogin" timeout="2880" />
</authentication>

客户总监

1
2
3
4
public ActionResult RedirectToLogin()
{
    return PartialView("_RedirectToLogin");
}

_RedirectToLogin视图

1
    window.location = '@Url.Action("Login","Account")';


受克拉姆文斯答案的启发,可以避免制作一个额外的RedirectToLogin视图(和控制器操作),而将以下内容放入原始的Login视图中:

1
2
if (window.location != '@string.Format("{0}://{1}{2}",Request.Url.Scheme, Request.Url.Authority,Url.Content("~/Account/Login"))')
            window.location = '@Url.Action("Login","Account")';

这将测试当前window.location,如果不符合预期,则会按预期进行设置。
我知道,我的js有点笨拙,但是可以完成工作:)


您可能要检查此(相似)问题的答案。

ASP.NET MVC部分视图Ajax发布?

基本上,它说您应该避免由于此问题和其他问题而对可能重定向的函数进行ajax调用。

通过在函数中手动授权/检查过期,然后返回可应用于整个页面的重定向信息,可以避免出现问题。

我已经使用了这种方法,并且效果很好。


问题是您的调用被[Authorize]拦截,甚至在调用您的操作方法代码之前就发送登录页面。解决此问题的一种方法是创建一个自定义操作过滤器,以检查超时并进行硬重定向到登录页面。下一篇文章写的很好,可以帮助您创建和注册过滤器

http://www.codeblockdrive.com/2012/12/mvc-custom-filters-session-timeout.html

祝你好运


我的解决方案是尽可能使用一些C#代码。我可以获得控制器和视图名称,检查它们是否应为正确的名称,如果没有重定向到正确的名称。

1
2
var controllerName = ViewContext.RouteData.GetRequiredString("controller");
var actionName = ViewContext.RouteData.GetRequiredString("action");

然后,我使用以下内容转到正确的URL:

1
2
3
4
if (controllerName !="members" && actionName !="logon")
{
    @{ Response.Redirect("~/Members/Logon");}
}

我有简单的方法来查找部分视图会话已过期。

创建一个简单的操作,然后调用该视图Java脚本windows.load(),然后将url传递到此登录页面。

//在控制器中创建一个动作。

1
2
<script type="text/javascript">
window.location = '@Url.Action("Login","LogIn")';

Public ActionResult SessionExpire()
{
return View();
}

//会话为null后,从partail视图重定向到登录:

return Redirect("~/OrderPlace/Sessionview");