您是否需要允许不同的控制器/视图使用一些通用属性?
然后我宁愿推荐一个通用的基本控制器,同时还将ViewBag
代码包装到类型安全的属性中(让编译器控制数据一致性 - 如您所知,ViewBag
它不是类型安全的,因此任何拼写错误和数据不匹配都不会被注意到,直到代码被执行)。
1. 引入具有这些包装器属性的通用控制器
public abstract class MyBaseController : Controller
{
internal long CurrentUserId
{
get { return ViewBag.CurrentUserId; }
set { ViewBag.CurrentUserId = value; }
}
internal Role CurrentUserRole
{
get { return ViewBag.CurrentUserRole; }
set { ViewBag.CurrentUserRole = value; }
}
...
}
因此,您继承的控制器可以简单地设置属性 - 或者,使用许多通用代码只需在您的基本控制器中引入一个方法 - 类似于您已经拥有的。
2. 引入具有这些包装器属性的通用视图类
public abstract class MyBaseViewPage<T> : WebViewPage<T>
{
public string Title
{
get { return (string)ViewBag.Title; }
set { ViewBag.Title = value; }
}
public long CurrentUserId
{
get { return (long)ViewBag.CurrentUserId; }
}
public Role CurrentUserRole
{
get { return ViewBag.CurrentUserRole; }
}
}
public abstract class MyBaseViewPage : MyBaseViewPage<dynamic>
{
}
并更新web.config
以让 MVC 知道您正在使用自定义基本视图:
<configuration>
...
<system.web.webPages.razor>
...
<pages pageBaseType="MyRootNamespace.Views.MyBaseViewPage">
...
</pages>
</system.web.webPages.razor>
现在您可以将它们用作控制器和视图中的普通属性。