我是 .Net 开发的新手,现在正在关注 NerdDinner 教程。只是想知道你们中是否有人能告诉我
ViewData 和 ViewModel 有什么区别
(我所知道的是它们用于将某种形式的数据从控制器传递到视图),也许会告诉我在什么情况下应该使用 ViewData 而不是 ViewModel,反之亦然
提前致谢!
莎莉
我是 .Net 开发的新手,现在正在关注 NerdDinner 教程。只是想知道你们中是否有人能告诉我
ViewData 和 ViewModel 有什么区别
(我所知道的是它们用于将某种形式的数据从控制器传递到视图),也许会告诉我在什么情况下应该使用 ViewData 而不是 ViewModel,反之亦然
提前致谢!
莎莉
什么是 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
结论
查看数据:
简而言之,使用 ViewData 作为支持数据,比如一个数据源到一个 SelectList。
视图模型:
当控制器类决定将 HTML 响应呈现回客户端时,它负责将呈现响应所需的所有数据显式传递给视图模板。视图模板不应该执行任何数据检索或应用程序逻辑——而应该将自己限制为仅具有由控制器传递给它的模型/数据驱动的渲染代码。
[...]
当使用 [“ViewModel”] 模式时,我们会创建针对特定视图场景进行优化的强类型类,并公开视图模板所需的动态值/内容的属性。然后,我们的控制器类可以填充这些视图优化类并将其传递给我们的视图模板以供使用。这可以在视图模板中实现类型安全、编译时检查和编辑器智能感知。