【问题标题】:ViewData and ViewModel in MVC ASP.NETMVC ASP.NET 中的 ViewData 和 ViewModel
【发布时间】:2011-07-07 19:52:17
【问题描述】:

我是 .Net 开发的新手,现在正在学习 NerdDinner 教程。只是想知道有没有人能告诉我

ViewData 有什么区别 和视图模型

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

提前致谢!

莎莉

【问题讨论】:

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


    【解决方案1】:

    什么是 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;
     }
    <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 是最好的选择。

    【讨论】:

    • 我经常发现将您需要的域模型作为私有成员加载到 ViewModel 中并通过属性公开您真正想要的视图内容更简洁。此外,如果您将其设置为适配器,则通过视图模型从视图返回的数据可以反过来水合隐藏域对象上的数据。
    【解决方案2】:

    查看数据:

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

    视图模型:

    ASP.NET MVC ViewModel Pattern

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

    [...]

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多