10

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

ViewData 和 ViewModel 有什么区别

(我所知道的是它们用于将某种形式的数据从控制器传递到视图),也许会告诉我在什么情况下应该使用 ViewData 而不是 ViewModel,反之亦然

提前致谢!

莎莉

4

2 回答 2

12

什么是 ViewData ?

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

查看数据示例

控制器动作方法喜欢:

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;
 }
<div>
    Today's Featured Product is!
    <h3>@viewDataProduct.Name</h3>
</div>

什么是 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 所需的基于属性的验证场景
  • 但不能使用 ViewData 进行此类验证
  • 作为最佳实践,请始终尝试在 Views 中使用强类型数据。ViewModel 是最好的选择。
于 2012-11-03T10:25:12.993 回答
8

查看数据:

简而言之,使用 ViewData 作为支持数据,比如一个数据源到一个 SelectList。

视图模型:

ASP.NET MVC 视图模型模式

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

[...]

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

于 2011-03-03T06:13:18.667 回答