如何将视图模型与分部视图一起使用



我已经阅读了很多关于视图模型的文章,包括关于SO的各种帖子,但我仍然不确定如何完全实现它们。我正在创建一个拍卖网站,我有我的主页索引页面。我想做的是显示图像(最终是一个可滚动的图像框(,显示当前"最优惠"的项目。因此,根据我对MVC的简单理解,我自然而然地创建了一个部分视图,我将使用该视图通过@Html.Action显示这些图像,并且我将使用控制器中的逻辑来计算和显示最优惠的项目。

从我所读到的内容来看,在这种情况下,最佳实践似乎是使用这些图像的逻辑和显示视图模型,因为我不需要所有项目字段。我在想我的视图模型将具有与图像文件名和 itemId 相同的项目属性,因此它仍然可以链接到详细信息页面,并且还有一个新字段,该字段将是 dealPercent 或类似的东西。在这种情况下,我如何设置和使用视图模型,将项目传递给每个视图模型,存储它们,因为它们与我的数据库分开等。我对此非常陌生,我缺少我想学习的MVC的基本部分。感谢您的任何帮助。

以下是我对 ViewModel 的一些用法,基本上视图模型是 MVVM 设计模式的一部分,这在向视图显示数据模型时是一个很好的做法。

1.( 您可以使用 ViewModel 将其他属性填充到视图的模型,该模型是强类型。例如,假设您要在编辑窗体上实现下拉列表,则可以使用强类型帮助程序(如 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 的任何更改都会通过编译时通知您,您还需要在视图上对其的所有引用进行更改。

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。

除此之外,您还可以访问以下内容:什么是 MVC 中的 ViewModel?,以及此 ViewModel 最佳实践,了解有关 ViewModel 的更多信息。

最新更新