我正在mvc3中创建一个应用程序,并想知道如何处理所有应用程序请求所需的数据库数据,其中一些依赖于会话,其中一些依赖于url模式,基本上所有数据都在数据库中。
喜欢了解最佳实践
答案 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()
用于此目的:
答案 3 :(得分:0)
我建议使用基础ViewModel类。 所以一个具有属性/函数的基类应该可以随时使用。