0

我的网站中有 2 个角色管理员和员工,还有 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("~/");
   }

}

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

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

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

1. _viewstart.cshtml 是否会在每个请求中执行,而不仅仅是视图?2. 我怎样才能消除这个错误?

4

3 回答 3

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);
}
于 2012-11-30T05:08:05.347 回答
0

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

于 2012-07-22T09:01:28.517 回答
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";
   }
}
于 2012-07-22T13:58:36.070 回答