所有视图的asp.net mvc5全局变量

问题描述 投票:0回答:1

我在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();
        }
    }

这减少了在每个动作中调用它,但仍然我必须在所有控制器中键入相同,这是否可以?我们如何才能为所有控制器全局编写

asp.net-mvc global-variables shared-data
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
© www.soinside.com 2019 - 2024. All rights reserved.