_viewstart.cshtml条件layout.cshtml获取错误此网页有一个重定向循环

时间:2012-07-22 08:44:58

标签: asp.net asp.net-mvc-3 razor

我的网站中有2个角色admin和employee,还有2个layout.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
   {
       Response.Redirect("~/");
   }

}

一切正常,但是其他部分,如果session等于null,则重定向到登录页面“〜/”。它还在登录页面上重定向,但问题是在登录视图中,当请求进入服务器以获取脚本或.css文件时,我有一些css链接和脚本链接。服务器再次重定向到_viewstart.cshtml并再次执行所有进程,我收到此错误

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

请在我的代码中建议我解决方案或让我知道我错在哪里

1.Is _viewstart.cshtml是否对每个请求执行不仅包含视图? 2.如何删除此错误?

3 个答案:

答案 0 :(得分:0)

而不是Response.Redirect为什么不使用RedirectToAction

答案 1 :(得分: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";
   }
}

答案 2 :(得分:0)

简单地说,@ Mark是对的。始终调用_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);
}