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

时间:2018-06-18 16:25:39

标签: asp.net-mvc mvvm asp.net-mvc-viewmodel

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

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

1 个答案:

答案 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的其他信息。