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

How to use ViewModels with Partial Views

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

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

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

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 的强类型 View 的优势在于,编码时 ViewModel 上的任何更改都会通过编译时间通知您,您需要在 View 上对它的所有引用进行更改以及。

2.) 您可以防止不必要地保存您的 table 记录。这是您网站的安全功能之一。例如,在您的网站上编辑您的记录时,您只能在您的 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 的原因之一。

有时,我需要在一个视图上同时获取多个模型。我通常遇到的场景之一是当我级联数据时,例如,当我需要加载这个模型时,我需要加载不同的模型实例及其属性,绝对不能在普通模型上这样做,而是为此你需要一个 ViewModel。

除此之外,您还可以访问此链接:What is ViewModel in MVC? and this ViewModel Best Practices 了解有关 ViewModel 的更多信息。