MVC3加载视图的常用数据

时间:2011-09-27 13:05:43

标签: asp.net-mvc-3

我正在开发一个包含多个“网站”的MVC3“电影列表”应用程序,具体取决于请求主机名。

我正在尝试使用像这样强类型的ViewModel(简化示例以了解问题的本质):

class ViewModelBase
{
  public int siteId { get; private set; }

  public ViewModelBase(DbContext db)
  {
    siteId = <here I want to make a db-lookup based on the request hostname> <== This is my problem
  }
}

class MoviesIndexViewModel : ViewModelBase
{
  public List<Movie> movies { get; private set; }

  public MoviesIndexViewModel(DbContext db) : base(db)
  {
    movies = db.Movies.where(m => m.SiteId == siteId).ToList();
  }
}

我的控制器就这样做了:

public class MoviesController : Controller
{
  public ActionResult Index()
  {
    var model = new MoviesIndexViewModel(new MySpecialDbContext());
    return View(model);
  }
}

问题是:如何将“请求主机头”置于上面显示的代码行中?我知道如何进行实际的数据库查找,但我可以在这里访问任何请求参数吗?或者我应该通过参数向构造函数提供一些东西吗?

1 个答案:

答案 0 :(得分:3)

我不会在我的视图模型中使用Dbcontext。阅读Separation of concerns

相反,请在OnResultExecuting中使用BaseController添加公共数据:

protected override void OnResultExecuting(ResultExecutingContext filterContext)
{
    var baseModel = filterContext.Controller.ViewData.Model as YourCustomModel;
    if (baseModel != null)
    {
        // call a repository or whatever to add information to the model.
    }

    base.OnResultExecuting(filterContext);
}

<强>更新

是肯定的。控制器是“模型”(repositores,webservices或任何其他数据源)和视图之间的粘合剂。 ViewModel只是一种从视图中移开逻辑的抽象。

以下是使用视图模型的三个主要原因: http://blog.gauffin.org/2011/07/three-reasons-to-why-you-should-use-view-models/

另一种处理常见视图数据的方法:http://blog.gauffin.org/2011/09/getting-information-into-the-layout-without-using-viewbag/