0

私のウェブサイトには管理者と従業員の 2 つの役割があり、layout.cshtml も 2 つあります。私の _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にリダイレクトし、すべてのプロセスが実行されますが、このエラーが発生しています

この Web ページにはリダイレクト ループがあります localhost アドレスの Web ページでリダイレクトが多すぎます。このサイトの Cookie を消去するか、サードパーティの Cookie を許可すると、問題が解決する場合があります。そうでない場合は、コンピューターの問題ではなく、サーバーの構成の問題である可能性があります。

解決策を提案するか、コードのどこが間違っているか教えてください

1. _viewstart.cshtml は、ビューだけでなくすべてのリクエストで実行されますか? 2. このエラーを取り除くにはどうすればよいですか?

4

3 に答える 3

0

Response.Redirect の代わりにRedirectToActionを使用しない理由

于 2012-07-22T09:01:28.517 に答える
0

_ViewStart.cshtmlビューがレンダリングされるたびに呼び出されます。

この状態では、管理者用と従業員用の 2 種類のレイアウトを使用しています。

匿名ユーザーに使用するレイアウトは?

匿名ユーザーの場合は明らかSession["Role"]にnullになり、再びログインアクションにリダイレクトして、再び呼び出すビューを再度出力する_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 に答える
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 に答える