在我正在处理的网站上,有些用户在网站上拥有不同的权限。
根据我们当前正在查看的计划ID和员工ID,我们可以获得他们的角色特定权限。
现在,我们的BaseModel有一个属性,可以正确访问数据库并获取此信息。 对于将模型传递给视图的所有视图,一切运行正常。
问题在于控制器方法,其中没有传递模型。在一些视图中,它们提供的只是一些ViewBag条目,并且工作正常。
但是,对于布局,我/需要/那些页面中的CurrentPermissions属性。无论权限是否有一个布尔值设置为true / false,都可能/可能不会显示/填充某些内容。
所以,我的选择似乎是:
如何将此CurrentPermissions对象(通过调用我的TransactionManager生成)推送到每个视图(特别是布局!)
答案 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。只有少数情况,所以它并没有那么糟糕。
但更好的建议会很棒。