【问题标题】:How to put LINQ condition on partial view used by all the views in razor MVC project?如何将 LINQ 条件放在 razor MVC 项目中所有视图使用的部分视图上?
【发布时间】:2018-01-30 09:06:36
【问题描述】:

我有一个局部视图 _Layout 被所有视图使用,每个视图都是一个强类型视图。 现在我的查询是,每个登录的用户都属于一个部门,我希望在特定部门的用户登录网站时隐藏一些选项卡(从部分视图中),并为所有其他用户显示所有选项卡。 我尝试使用 LINQ 查询在所有 ActionResult 中获取部门名称,存储在 ViewBag 中并将条件放入共享视图中:

      @if (ViewBag.Department == "CUSTOMER SUPPORT")
      {
          //View all the tabs
      }
      else
      {
          //Restricted tabs
      }

为此,我必须声明 ViewBag,并在每个 ActionResult 中进行 LINQ 查询以隐藏/显示选项卡,即使用户从共享视图上显示的选项卡导航到不同的页面。

我也尝试过将局部视图设为强类型,以便模型保存部门名称的值,但是当我导航到另一个强类型视图时它不起作用。 p>

我能否以某种方式全局声明一个变量来存储部门名称并调用共享视图,而不是在每个 ActionResult 上声明? 或者直接在没有控制器的共享视图上获取部门的名称,比如在共享视图上使用 LINQ?

【问题讨论】:

    标签: c# asp.net-mvc linq asp.net-mvc-4 razor


    【解决方案1】:

    如果我没有误会您的意思,并且您的标签类似于导航而不是内容,这可以帮助您:Use of child action in layout view

    1. 使用专用视图模型创建单独的导航视图。
    2. 为上面创建一个填充视图模型的操作(决定显示哪些选项卡)
    3. 使用@Html.Action 从布局视图中调用上述操作

    【讨论】:

      【解决方案2】:

      您可以为此创建操作过滤器。

      public class SomeMsgAttribute : FilterAttribute, IResultFilter
      {
              public void OnResultExecuted(ResultExecutedContext filterContext)
              {
              }
      
              public void OnResultExecuting(ResultExecutingContext filterContext)
              {
                  filterContext.Controller.ViewBag.Department= "Department";
              }
      }
      

      然后你就可以用这个属性来装饰你的控制器了。

      [SomeMsg]
      public class MyController: Controller
      {
         public ActionResult Index()
         {
            return View();
         }
      }
      

      【讨论】:

      • 我认为如果您提供一个实际示例来说明这将如何对 OP 起作用,因为目前我认为这不能完全回答问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2016-07-18
      • 2011-06-29
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      相关资源
      最近更新 更多