Mvc3 - 处理(几乎)所有请求所需数据的最佳做法?

时间:2011-07-01 13:21:52

标签: asp.net-mvc-3

我正在mvc3中创建一个应用程序,并想知道如何处理所有应用程序请求所需的数据库数据,其中一些依赖于会话,其中一些依赖于url模式,基本上所有数据都在数据库中。

喜欢了解最佳实践

4 个答案:

答案 0 :(得分:3)

我在我的应用程序中所做的并认为最佳做法是将公共数据加载到Controller构造函数的ViewBag上。

对于每个项目,我都有一个扩展Controller的DefaultController抽象类。因此,项目中的每个控制器都必须从DefaultController而不是Controller继承。在该类的构造函数中,我加载了整个项目的所有公共数据,如下所示:

// DefaultController.cs
public abstract class DefaultController : Controller
{
    protected IRepository Repo { get; private set; }

    protected DefaultController(IRepository repo)
    {
        Repo = repo;
        ViewBag.CurrentUser = GetLoggedInUser();
    }

    protected User GetLoggedInUser()
    {
        // your logic for retrieving the data here
    }
}


// HomeController.cs
public class HomeController : DefaultController
{
    public HomeController(IRepository repo) : base(repo)
    {
    }

    // ... your action methods
}

这样,您的视图中始终可以使用登录用户。

答案 1 :(得分:3)

我和@rdumont一样,但有一个例外:我创建了一个CommonViewModel,我用它来定义我使用的所有常见属性。

public class CommonViewModel
{
    public string UserName {get;set;}
    public string Extension {get;set; }
}

在基本控制器中声明一个属性:

public abstract class BaseController : Controller
{
    protected CommonViewModel Commons { get; private set; }

    protected virtual void OnResultExecuting(ResultExecutingContext filterContext)
    {
        ViewBag.Commons = Commons;
    }
}

通过这样做,我得到几乎所有类型的东西。我需要做的唯一演员是将ViewBag.Commons投射到CommonViewModel

答案 2 :(得分:3)

最好是避免使用ViewBag。

请参阅此答案,其中详细说明了如何将Html.RenderAction()用于此目的:

Best way to show account information in layout file in MVC3

答案 3 :(得分:0)

我建议使用基础ViewModel类。 所以一个具有属性/函数的基类应该可以随时使用。