我在DB中有fb,twitter和youtube网址,还有大约30个其他应用程序级变量。
目前我在模板中的每个动作bcz中查询它我在页脚中有社交链接,如果错过将导致错误。
ViewBag.Contents = db.Contents.Where(s => s.status == 1).OrderBy(s => s.group).ThenBy(s => s.sort).ToList();
我希望上面的行能够在某个地方执行所有动作。谷歌搜索它,许多人建议投入会议,但我认为这不应该在会话变量,因为它的大小可能会很长。
我的所有控制器都是从Controller
继承而来的
public class HomeController:Controller {}
请帮忙。
更新我在家庭控制器中创建了构造函数,如下所示
public HomeController()
{
if (ViewBag.Contents == null)
{
ViewBag.Contents = db.Contents.Where(s => s.status == 1).OrderBy(s => s.sort).ToList();
}
}
这减少了在每个动作中调用它,但仍然我必须在所有控制器中键入相同,这是否可以?我们如何才能为所有控制器全局编写
如果必须这样做,只需为您的应用程序创建一个基本控制器。
public class BaseController : Controller
{
public BaseController()
{
if (ViewBag.Contents == null)
{
ViewBag.Contents = db.Contents.Where(s => s.status == 1).OrderBy(s => s.sort).ToList();
}
}
}
public class HomeController : BaseController {
}
但是,我不会建议使用ViewBag。它的动态性意味着你没有编译时间的确定性。最佳途径是为每个View使用强类型ViewModel。如果您在所有页面中都有所需的数据,则可以使用基本视图模型。
public class BaseViewModel
{
public List<object> Contents { get; }
public BaseViewModel()
{
if (Contents == null)
{
Contents = db.Contents.Where(s => s.status == 1).OrderBy(s => s.sort).ToList();
}
}
}
public class ViewModel: BaseViewModel {
}
用法:
将其放在视图的顶部:
@model ViewModel
然后,您可以使用Razor语法访问内容:
@Model.Contents