MVC ASP.NET中的ViewData和ViewModel

时间:2011-03-03 06:01:02

标签: c# asp.net view controller asp.net-mvc-viewmodel

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

  

ViewData之间有什么区别   和ViewModel

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

提前致谢!

萨利

2 个答案:

答案 0 :(得分:10)

什么是ViewData?

  • 您将数据放入的字典对象,然后成为 可供观看。

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?

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

就像:

View Model image

如何将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是最佳候选者。

答案 1 :(得分:8)

<强>的ViewData:

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

<强>视图模型:

ASP.NET MVC ViewModel Pattern

  

当Controller类决定将HTML响应呈现给a时   客户,它负责   显式传递给视图   模板所需的所有数据   呈现响应。查看模板   永远不应该执行任何数据   检索或应用程序逻辑 - 和   应该限制​​自己   只有渲染代码   驱逐出传递给的模型/数据   它是由控制器。

     

[...]

     

使用[ViewModel“]模式时,我们会创建强类型   为我们优化的类   具体的视图场景,以及哪些   公开动态的属性   我们的观点所需的价值/内容   模板。我们的控制器类可以   然后填充并传递这些   视图优化的类到我们的视图   要使用的模板。这使得   类型安全,编译时检查,   和视图中的编辑器智能感知   模板。