我在view模型上阅读了很多内容,包括SO上的各种帖子,我仍然不确定如何完全实现它们。我正在创建一个拍卖网站,我有我的主页索引页面。我想要做的是显示图像(最终是一个可滚动的图像框),显示当前“最佳交易”的项目。很自然地,根据我对MVC的简单理解,我创建了一个局部视图,我将使用@ Html.Action来显示这些图像,我将使用控制器中的逻辑来计算和显示具有最佳交易的项目。
根据我的阅读,似乎最好在这种情况下使用viewmodels来显示这些图像的逻辑和显示,因为我不需要所有的items字段。我认为我的viewmodel将具有与imageFileName和itemId相同的属性,因此它仍然可以链接到详细信息页面,并且还有一个新的字段,即dealPercentage或其他类似的效果。在这种情况下,我如何设置和使用视图模型,将项目传递给每个视图模型,存储它们,因为它们与我的数据库是分开的等等。我对此非常陌生,我错过了我想要的MVC的基本部分学习。感谢您的帮助。
答案 0 :(得分:2)
以下是我对ViewModel的一些使用,基本上View Model是MVVM设计模式的一部分,在向View中显示数据模型时这是一个很好的做法。
1。)您可以使用ViewModel将其他属性填充到View类型中,该类型是强类型。例如,假设您要在编辑表单上实现下拉列表,可以使用强类型帮助程序(如DropDownListFor)来实现:
@Html.DropDownListFor(x => x.SelectedItem, new SelectList(Model.Items), "Please select an item." )
而不是像本例中那样使用ViewBag和ViewData:
@Html.DropDownList("SelectedItems", new SelectList((IEnumerable) ViewData["tempItems"], "Id", "Name"), "Please select an item.")
您可以在ViewModel上添加这些属性,而不会影响主模型。由于您的模型与数据库环境紧密相连。
拥有一个链接到ViewModel的强类型View的优点是,编码时ViewModel上的任何更改都会通过编译时通知您需要在View的所有引用上更改它。
2.)您可以防止对表记录进行不必要的保存。这是您网站的安全功能之一。例如,在网站上编辑记录时,您只能在ViewModel上指定可以编辑的属性:
示例:
[HttpGet]
public ActionResult EditPage()
{
ViewModel vm = new ViewModel();
return View(vm);
}
[HttpPost]
public ActionResult EditPage(ViewModel model)
{
//Get first the Model that you want to edit
ActualModel AM = dbContext.ActualModel.SingleOrDefault(x => x.ID = model.ID);
//Update the properties that you only specify that needs to be edited
AM.Property1 = model.Property1;
AM.Property2 = model.Property2;
dbContext.ActualModel.Add(AM);
dbContext.Entry(AM).State = System.Data.Entity.EntityState.Modified;
dbContext.SaveChanges();
return View(model);
}
此图例在保存或添加新记录时也适用。
3.)您可以在一个ViewModel中封装不同的对象或模型。这与我的第一个例子几乎相同,但这个是我开始使用ViewModel的原因之一。
有时候,我需要同时在一个View上获得多个模型。我通常遇到的一个场景是当我级联数据时,例如,当我需要加载此模型时,我需要加载不同的Model实例及其属性,绝对不能在普通模型上执行此操作,而是你需要一个ViewModel。
除此之外,您还可以访问:What is ViewModel in MVC?和此ViewModel Best Practices以获取有关ViewModel的其他信息。