.Net MVC Partial View load login page when session expires
我正在使用.net MVC 4构建Web应用程序。
我有一个ajax表单来编辑数据。
如果用户闲置15分钟,它将使用户会话期满。 如果发生这种情况,如果用户单击"编辑"按钮,则会将登录页面加载到部分内容中,因此当前会话将过期。
编辑链接-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调用。
通过在函数中手动授权/检查过期,然后返回可应用于整个页面的重定向信息,可以避免出现问题。
我已经使用了这种方法,并且效果很好。
问题是您的调用被
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")'; |
{
return View();
}
//会话为null后,从partail视图重定向到登录: