【问题标题】:Dynamic Navbar links in the shared layout MVC/Razor共享布局 MVC/Razor 中的动态导航栏链接
【发布时间】:2019-10-15 04:01:01
【问题描述】:

我希望导航栏上的链接根据数据库中的数据显示或消失。所有导航栏链接都在 _Layout.cshtml 中,所有页面都在使用它。

<ul>
 @if (User.Identity.IsAuthenticated)
  {
   <li class="nav-item dropdown">
     <a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Bookings</a>
     <ul class="dropdown-menu">                             
     <li>@Html.ActionLink("All Bookings", "GetAllBookings", "Booking")</li>
     <li>@Html.ActionLink("Member's Dashboard", "GetBookingsByStatus", "Booking")</li>
     </ul>
   </li>                     
</ul>

我希望会员的仪表板仅在他们是会员并且在其个人资料中具有某些属性时才显示。根据数据库中的数据动态更改导航栏链接的最佳方法是什么?

【问题讨论】:

  • 而不是这个用户认证检查,而是使用您自己的自定义检查,例如用户是否具有特定属性或特定角色。创建第一个请求后,您可以加载这些值,并可以检查共享视图并根据条件呈现视图。
  • @RajeshB 如何检查网站属性,这是我的全部问题。这是每个控制器都使用的布局页面,并且布局页面没有使用任何模型,那么我将如何获取数据?
  • 你了解如何在布局页面上包含条件 if 吗?如果没有,我会发布一些给你提示的东西。
  • @JohnLord 我知道如何在剃刀视图中写 If 和 else ?我想知道如何在布局页面中获取数据。例如:成员属性在表 tblCustomer 中,此布局页面不使用任何模型。如果您想查看任何代码,请告诉我?
  • 抱歉耽搁了。工作紧急。所以基本上你必须将数据传递给页面才能对数据采取行动。你有几个选择。一种是为要使用的页面创建一个模型,但这在这种情况下可能没有用。您还可以传递 viewbag 变量。据我所知,这是您仅有的两个选择。发布代码并没有什么坏处,有人可以为您做更多的事情。

标签: c# asp.net asp.net-mvc razor model-view-controller


【解决方案1】:

即使在您的示例代码中,您也可以通过将列表项包装在 @if 条件中并以您认为合适的任何方法检查它们的权限来省略列表项。

但是,我希望我指出的是显而易见的,但这种方法只会隐藏链接。它不会阻止用户输入或使用书签。您还需要在控制器中复制安全检查。

【讨论】:

  • 这怎么可能,正如我提到的,这是每个控制器都使用的布局页面。它没有使用任何模型。它将如何拥有控制器/模型数据?你能分享一些示例代码吗?
  • 布局页面可能不使用控制器,但链接肯定可以。我是说您需要在每个页面上进行权限检查,而不仅仅是在主菜单上。重定向到您的主页。像这样的东西: [Authorize(Roles = "viewOrders")] public ActionResult OrderList() { (您不能对评论进行编码标记)这假设您正在使用数据库中的角色。如果没有,您可以编写自己的函数并签入控制器。 if (!CheckIfHasPermission(user)) return RedirectToAction("MainMenu");
  • 我不想将它们重定向到不同的页面,我没有使用角色。如果链接具有某些属性,我希望链接不显示。这些操作链接位于共享布局页面上。
  • 但您需要从控制器内部重定向它们。控制器必须是安全的,否则即使按钮消失了,也有人可以直接访问链接。如果您现在正在使用角色,则可以通过每个函数上的注释来检查它们。
猜你喜欢
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 2021-11-28
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多