2017-08-03 88 views
1

我是MVC的初学者,并试图将Admin重定向到_Layout - admin.cshtml登录成功后,因为我在管理navbar中有不同的选项。我已经登录并将布局重定向到_Layout - admin.cshtml成功。但是,当我点击图库选项时,我的布局再次移动到之前的_Layout.cshtml。这是不正确的。在mvc登录后将管理员重定向到布局

任何人都可以建议我,我该如何解决这个问题?

_layout - admin.cshtml

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <title>@ViewBag.Title - SS General Trading</title> 
    @Styles.Render("~/Content/css") 
    @Scripts.Render("~/bundles/modernizr") 

</head> 
<body> 
     @RenderPage("~/Views/Shared/Navbar-admin.cshtml") 
    <div> 
     @RenderBody() 
     <hr /> 
     <footer style="margin-top:-50px; z-index:999" class="site-footer"> 
      <div class="row"> 
    <div style="border-right:groove" class="col-md-4"> 

    </div> 
    <div style="border-right:groove" class="col-md-4"> 

    </div> 
    <div class="col-md-4"> 
    </div> 
      </div> 
     </footer> 
    </div> 


    @Scripts.Render("~/bundles/jquery") 
    @Scripts.Render("~/bundles/bootstrap") 
    @RenderSection("scripts", required: false) 
</body> 
</html> 

导航栏,admin.cshtml

@{ Layout = null; } 
<!DOCTYPE HTML> 
<html lang="en"> 
<head> 
    -------- some code 
</head> 
<body> 
    <!-- header-top --> 
    <div class="header-top"> 
     ------- some code 
      <div class="top-nav"> 
       <nav class="navbar navbar-default"> 
        <div class="container"> 
         <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> 
          Menu 
         </button> 
        </div> 
        <!-- Collect the nav links, forms, and other content for toggling --> 
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> 
         <ul class="nav navbar-nav"> 
          <li class="home-icon"><a href="index.html"><span class="fa fa-home" aria-hidden="true"></span></a></li> 
          <li>@Html.ActionLink("News", "Index", "News_Events")</li> 
          <li>@Html.ActionLink("Gallery", "Index", "Galleries")</li> 
          @Html.Partial("_LoginPartial") 
         </ul> 
        </div> 

         <div class="clearfix"> </div> 
        </div> 
       </nav> 
      </div> 
     </div> 
     <!-- //container --> 
    </div> 
    </body> 
</html> 

_ViewStart.cshtml

@{ 
    if (this.User.IsInRole("Admin")) 
    { 
     Layout = "~/views/shared/_layout - admin.cshtml"; 
    } 
    else 
    { 
     Layout = "~/Views/Shared/_Layout.cshtml"; 

    } 

} 
+0

你为什么试图重定向到布局? – CodeCaster

+0

你想要做什么? –

+0

我想在管理员登录后重定向我的布局,因为管理员navbar bcz admin navbar在我的情况下是不同的。 –

回答

2

我已经加入

@{ 
    Layout = "~/Views/Shared/_Layout - admin.cshtml"; 
} 

此行〜/查看/画廊/ index.cshtml解决我的问题。

2

您不能重定向到布局 - 请参阅下面的布局说明。
你需要重定向到一个使用布局的页面 - 在你的情况下,Index.cshtml

布局基础:

ASP.NET MVC具有包含常见的UI部分,这样我们就不必写在每一页相同的代码的布局图。使用布局的视图的标记将嵌入到此行的布局标记中:

@RenderBody() 

这是嵌入某个特定页面的位置。 您得到错误的原因是因为当您尝试重定向到布局时,它不知道它应该如何呈现内容。

看看你Index.cshtml

@{ 
    Layout = "~/Views/Shared/_Layout - admin.cshtml"; 
} 

当您重定向到Index.cshtml,这意味着这个特定视图Index.html的标记将被嵌入到在RenderBody()线布局_Layout - admin.cshtml

那就是基本概念。

你的情况:

如果你想加入一些只管理,导航栏(应为:呈现基于某些条件额外的东西),你可以做条件呈现:

包括一些布局逻辑:

<!-- only render navbar for admins!--> 
@If(User.IsAuthenticated && User.IsInRole("Admin"){ 
    Html.RenderPartial("~/Views/Shared/Navbar-admin.cshtml"); 
} 

而导航栏将只呈现给管理员。
我相信你应该使用Html.RenderPartial("your navbar")而不是RenderPage()Why

@克里斯普拉特回答可能是在某些情况下更好的解决方案,因为它可以让你保持你的布局干净(无@if树)当你有四处传播了一堆东西,管理员 - 但你会复制一些码。

1

如果您对管理员的布局不同,最好的方法是使用_ViewStart.cshtml。只需添加到您的Views文件夹中的项目,与类似以下内容:

@{ 
    Layout = User.IsAuthenticated && User.IsInRole("Admin") 
     ? "~/Views/Shared/_Layout - admin.cshtml" 
     : "~/Views/Shared/_Layout.cshtml"; 
} 

_ViewStart.cshtml基本设置该文件夹下的文件夹中的所有视图它在或任何文件夹的默认。在这里,我们将根据用户是否以管理员身份登录来设置默认布局。

+0

不错的答案,我不知道这一点。它如何与分配有布局的经典视图一起工作?视图中的分配是否会覆盖此设置? – evictednoise

+0

是的,视图中的显式赋值将覆盖其他所有内容。 –

相关问题