MVC ASP.NET中的ViewData和ViewModel

我是.Net开发的新手,现在正在关注NerdDinner教程。 只是想知道你们中是否有人能告诉我

ViewData和ViewModel之间有什么区别

(我所知道的是他们习惯将某些forms的数据从控制器传递到视图)并且可能告诉我应该在什么情况下使用ViewData而不是ViewModel,反之亦然

提前致谢!

出击

ViewData的:

简而言之,使用ViewData作为支持数据,例如SelectList的数据源。

视图模型:

ASP.NET MVC ViewModel模式

当Controller类决定将HTML响应呈现给客户端时,它负责将呈现响应所需的所有数据显式传递给视图模板。 视图模板永远不应该执行任何数据检索或应用程序逻辑 – 而应该将自己限制为仅具有由控制器传递给它的模型/数据驱动的渲染代码。

[…]

当使用[ViewModel]模式时,我们创建强类型类,这些类针对我们的特定视图场景进行了优化,并公开了视图模板所需的动态值/内容的属性。 然后,我们的控制器类可以填充这些视图优化类并将其传递给我们的视图模板以供使用。 这样可以在视图模板中实现类型安全,编译时检查和编辑器智能感知。

什么是ViewData?

  • 您将数据放入的字典对象,然后可供视图使用。

ViewData示例

Controller Action方法喜欢:

public class HomeController : Controller { public ActionResult Index() { var featuredProduct = new Product { Name = "Smart Phone", QtyOnHand = 12 }; ViewData["FeaturedProduct"] = featuredProduct; return View(); } } 

如何在View上使用ViewData?

 @{ var viewDataProduct = ViewData["FeaturedProduct"] as Product; } 
Today's Featured Product is!

@viewDataProduct.Name

什么是ViewModel?

  • 允许您将一个或多个数据模型或源中的多个实体整形为单个对象
  • 针对视图的消费和渲染进行了优化

就像是 :

查看模型图像

如何将ViewModel与MVC 3一起使用?

领域模型

 public class Product { public Product() { Id = Guid.NewGuid(); Created = DateTime.Now; } public Guid Id { get; set; } public string ProductName { get; set; } } 

视图模型

 public class ProductViewModel { public Guid VmId { get; set; } [Required(ErrorMessage = "required")] public string ProductName { get; set; } } 

控制器动作方法

 [HttpGet] public ActionResult AddProduct() { //for initialize viewmodel var productViewModel = new ProductViewModel(); //assign values for viewmodel productViewModel.ProductName = "Smart Phone"; //send viewmodel into UI (View) return View("AddProduct", productViewModel); } 

查看 – AddProduct.cshtml

 @model YourProject.ViewModels.ProductViewModel //set your viewmodel here 

结论

  • 通过使用ViewModel可以将强类型数据传递到View中
  • 但是ViewData是松散类型的。所以需要在View上投射数据
  • ViewModel可用于复杂方案,例如合并多个域模型
  • 但ViewData只能用于简单的场景,例如为下拉列表带来数据
  • ViewModel可用于Ui所需的基于属性的validation方案
  • 但是不能使用ViewData进行这种validation
  • 作为最佳实践,总是尝试使用Views.ViewModel的强类型数据。