2012-07-22 85 views
0

我有2个角色管理员和员工在我的网站和2 layout.cshtml以及。在我_viewstart.cshtml文件_viewstart.cshtml条件layout.cshtml获取错误此网页有一个重定向循环

@{ 
    if (!ReferenceEquals(Session["Role"], null)) 
    { 
     if (Session["Role"].ToString() == "Admin") 
     { Layout = "~/Views/Shared/_AdminLayout.cshtml"; } 
     else 
     { Layout = "~/Views/Shared/_EmployeeLayout.cshtml"; } 

    } 
    else 
    { 
     Response.Redirect("~/"); 
    } 

} 

一切工作正常,但else部分,如果会议就是等于空比我重定向到登录页面“〜/”。它也在登录页面上重定向,但问题是,在登录视图中,我有一些css链接和脚本链接,当请求到达脚本或.css文件的服务器时。服务器再次重定向到_viewstart.cshtml并再次执行所有进程,并且出现此错误

此网页有重定向循环 localhost地址的网页导致了太多重定向。清除您的本网站的Cookie或允许第三方Cookie可以解决此问题。如果没有,这可能是一个服务器配置问题,而不是您的计算机的问题。

请表明我的解决方案或让我知道我错在这里是我的代码

1.Is _viewstart.cshtml不仅可以欣赏每一个请求执行? 2.如何删除此错误?

+0

如果Session [“Role”]为空,您将使用哪种布局? – VJAI 2012-07-22 13:47:54

+0

如果会话为空比我重定向到登录视图和登录视图没有任何关联的布局视图 – Himanshu 2012-07-22 16:19:13

回答

0

相反的Response.Redirect的你为什么不使用RedirectToAction

+0

如何在剃须刀我使用那里Response.RedirectToRoute(“Login”); 但是不会实现错误错误 – Himanshu 2012-07-22 09:18:39

+0

@Himanshu请把这个写在你的问题中并更新它,这将帮助我们快速回复 – HatSoft 2012-07-22 09:20:33

+0

@HatSoft:我应该提出什么问题? – Himanshu 2012-07-22 09:22:37

0

_ViewStart.cshtml都会被调用视图将被渲染时间。

在您使用两种布局的情况下,一种用于管理员,另一种用于员工。

您将为匿名用户使用哪种布局?

对于匿名用户显然Session["Role"]将是无效和您再次重定向到登录的行动,再次输出再次调用_ViewStart.cshtml所以你是在一个循环的视图。

我想你不应该在_ViewStart.cshtml做重定向登录页面,基本上它应该由授权过滤器。

你可以改变这样的状况,

@{ 
    if (!ReferenceEquals(Session["Role"], null)) 
    { 
     if (Session["Role"].ToString() == "Admin") 
     { Layout = "~/Views/Shared/_AdminLayout.cshtml"; } 
     else 
     { Layout = "~/Views/Shared/_EmployeeLayout.cshtml"; } 

    } 
    else 
    { 
     Layout = "~/Views/Shared/_GeneralLayout.cshtml"; 
    } 
} 
+0

是的,我没有重定向之前,但在那个时候视图没有.css重定向,他们没有重定向到会话过期后的登录页面,这就是为什么我添加了该代码。而且我们在网页表单母版页中做同样的事情,所以我提出了这个代码。 与您的解决方案,我必须采取一个更多的布局视图,因为授权没有发生 – Himanshu 2012-07-22 15:39:24

0

简单地说,@马克是正确的。总是调用_ViewStart.cshtml,即使对于没有布局的页面也是如此。所以,你在循环。所以,在你_ViewStart.cshtml

@{ 
    if (!ReferenceEquals(Session["Role"], null)) 
    { 
     if (Session["Role"].ToString() == "Admin") 
     { Layout = "~/Views/Shared/_AdminLayout.cshtml"; } 
     else 
     { Layout = "~/Views/Shared/_EmployeeLayout.cshtml"; } 
    } 
    else 
     Layout = null; 
} 

使用此之后,创建一个类BaseController,添加下面的方法,并让所有的控制器扩展它。

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (ReferenceEquals(Session["Role"], null)) 
     Redirect("~/"); 

    base.OnActionExecuting(filterContext); 
}