为所有视图 asp.net MVC5 全局变量



我在数据库中有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

相关内容

  • 没有找到相关文章

最新更新