1

我有 c# 的 mvc3 应用程序。在这里,我总是发送一些对象列表来做每个视图。在我声明的每个控制器中

DBEntities db = new DBEntities();

在我写的每一个观点中:

    public ActionResult Index()
    {
        ViewBag.Categories = db.Categories.ToList();
        ViewBag.Brands= db.Brands.ToList();
        ViewBag.Products= db.Products.ToList();
        ...
        return View();
    }

在其他观点我也写

public ActionResult OtherView()
        {
            ViewBag.Categories = db.Categories .ToList();
            ViewBag.Brands= db.Brands.ToList();
            ViewBag.Products= db.Products.ToList();
            ...
            return View();
        }

在其他控制器及其视图中,我从 db 调用相同的集合。有什么方法可以编写此代码 1 次并将它们发送到布局视图?

4

2 回答 2

1

您可以定义一个基本控制器并在其构造函数中创建这些列表。

public class MyBaseController : Controller
{
    public MyBaseController
    {
        DBEntities db = new DBEntities();
        ViewBag.Categories = db.Categories.ToList();
        ViewBag.Brands= db.Brands.ToList();
        ViewBag.Products= db.Products.ToList();
    }
}

然后确保你的所有控制器都派生自这个类。然而,这意味着对您的应用程序的每个请求都会让您获取这些表中的所有数据。这可能会降低您的性能。您可以考虑异步获取和显示它们。

于 2012-08-18T13:59:05.100 回答
1

您可以在控制器中创建一个方法来执行此操作:

private void PopulateViewBags()
{
    ViewBag.Categories = db.Categories.ToList();
    ViewBag.Brands= db.Brands.ToList();
    ViewBag.Products= db.Products.ToList();
}

然后在你ActionResults刚刚调用它:

public ActionResult Index()
{
    PopulateViewBags();
    ...
    return View();
}

这是一种简单的方法,它允许您进行缓存PopulateViewBags(),从而减少对数据库的访问。这使您无需去数据库就可以拥有其他Actions不需要这些功能的设备。ViewBags

于 2012-08-18T15:55:27.913 回答