我正在开发一个包含多个“网站”的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);
}
}
问题是:如何将“请求主机头”置于上面显示的代码行中?我知道如何进行实际的数据库查找,但我可以在这里访问任何请求参数吗?或者我应该通过参数向构造函数提供一些东西吗?
答案 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/