需要从所有视图访问变量

时间:2013-11-25 15:18:33

标签: c# asp.net-mvc asp.net-mvc-3

在我正在处理的网站上,有些用户在网站上拥有不同的权限。

根据我们当前正在查看的计划ID和员工ID,我们可以获得他们的角色特定权限。

现在,我们的BaseModel有一个属性,可以正确访问数据库并获取此信息。 对于将模型传递给视图的所有视图,一切运行正常。

问题在于控制器方法,其中没有传递模型。在一些视图中,它们提供的只是一些ViewBag条目,并且工作正常。

但是,对于布局,我/需要/那些页面中的CurrentPermissions属性。无论权限是否有一个布尔值设置为true / false,都可能/可能不会显示/填充某些内容。

所以,我的选择似乎是:

  • 以某种方式将我的CurrentPermissions抛出到所有视图的ViewBag条目中,并通过它而不是基本模型访问它们。
    • 我不知道该怎么做。我见过有人使用OnActionExecuting,但由于我此时尚未设置与TransactionManager的连接,因此失败了。
  • 以某种方式将BaseModel抛入那些当前未通过模型的视图中。我尽可能地避免这种情况。我不确定如何做到这一点,但似乎这会使情况过于复杂。

如何将此CurrentPermissions对象(通过调用我的TransactionManager生成)推送到每个视图(特别是布局!)

2 个答案:

答案 0 :(得分:1)

您的方法就是我们在项目中使用的方法......我们使用这种方法系统地删除ViewBag的使用,将其更改为ViewModels。

我们使用的其他方法(对于我的用例中的UserPreferences)是添加一个ActionFilter,其结束包括ViewBag中的首选项。在我的情况下,您使用[IncludePreferences]来装饰需要它的操作(这是我的过滤器属性的名称。

EDIT ActionFilter:

public class IncludePreferencesAttribute : ActionFilterAttribute
{
       public override void OnActionExecuting(ActionExecutingContext filterContext)
       {
              var controller = filterContext.Controller as BaseController;

              // IController is not necessarily a Controller
              if (controller != null)
              {
                     //I have my preferences in the BaseController
                     //and cached but here you can query the DB
                     controller.ViewBag.MyPreferences = controller.TenantPreferences;
              }
       }
}

在你的动作中,你使用[IncludePreferences]

来装饰它

答案 1 :(得分:0)

作为临时解决方案,我在布局的顶部执行以下操作:

@{ OurModel.SupervisorRestriction CurrentSupervisorRestrictions = ViewBag.CurrentSupervisorRestrictions ?? Model.CurrentSupervisorRestrictions; }

这样,如果我们传入一个对象然后就可以了。否则,我将直接从控制器传入ViewBag.CurrentSupervisorRestrictions。只有少数情况,所以它并没有那么糟糕。

但更好的建议会很棒。