0

我在 DB 中有 fb、twitter 和 youtube 网址,以及大约 30 个其他应用程序级变量。

目前我在模板中的每个动作 bcz 中查询它我在页脚中有社交链接,如果错过了会抛出错误。

ViewBag.Contents = db.Contents.Where(s => s.status == 1).OrderBy(s => s.group).ThenBy(s => s.sort).ToList();

我希望对全球某处的所有操作执行上述行。谷歌搜索,很多人建议放入会话,但我认为这不应该放入会话变量中,因为它的大小可能会很长。

我所有的控制器都继承自Controlleras

公共类 HomeController : 控制器{}

请帮忙。

更新 我在家庭控制器中创建了构造函数,如下所示

public HomeController()
    {
        if (ViewBag.Contents == null)
        {
            ViewBag.Contents = db.Contents.Where(s => s.status == 1).OrderBy(s => s.sort).ToList();
        }
    }

这减少了在每个动作中调用它,但我仍然必须在所有控制器中输入相同的内容,这可以吗?以及我们如何为所有控制器全局编写这个

4

1 回答 1

1

如果您必须这样做,只需为您的应用程序创建一个基本控制器。

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
于 2018-09-03T15:14:05.520 回答