我在数据库中有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 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。它的动态性质意味着您没有编译时间的确定性。最佳方法是对每个视图使用强类型的视图模型。如果您在所有页面上都有所需的数据,则可以简单地使用基本视图模型。
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