2011-03-03 127 views
10

我剛剛接觸.Net開發,現在正在關注NerdDinner教程。只是想知道如果任何你能告訴我MVC中的ViewData和ViewModel ASP.NET

什麼是ViewData的 和視圖模型之間的差異

(我所知道的是,他們被用來傳遞某種形式的數據從控制器到查看),也許告訴我什麼情況下,我應該使用ViewData而不是ViewModel,反之亦然

在此先感謝!

薩利

回答

7

的ViewData:

總之,使用的ViewData作爲載體的數據,如數據源到的SelectList。

視圖模型:

ASP.NET MVC ViewModel Pattern

當一個控制器類決定渲染HTML的響應回 客戶端,它負責 明確地傳遞給視圖 模板所有數據需要 呈現響應。 不應該執行任何數據檢索 或應用程序的邏輯視圖模板 - 和 應該將自己限制 只有渲染代碼,該代碼 趕走通過控制器傳遞給 它的模型/數據。

[...]

當使用[在「視圖模型」]模式,我們創建強類型 類,都爲我們的 具體查看方案進行了優化,並 公開屬性的動態 值/我們認爲 模板需要的內容。我們的控制器類可以通過 填充並將這些 視圖優化的類傳遞給我們的視圖 使用的模板。這使 類型安全,編譯時檢查, 和編輯器intellisense模板中的查看 。

+0

感謝您的回答,任何人需要了解更多關於這個話題我還發現了一個偉大的博客條目,涉及到我的問題http://theminimalistdeveloper.com/2010/08/21/why-when-and-如何使用typed-views-and-viewmodel-pattern-in-asp-net-mvc/ – 2011-03-03 06:55:30

9

什麼是ViewData?你把數據轉化爲

  • 字典對象,然後成爲 提供給視圖。

ViewData的樣品

控制器的操作方法很喜歡:

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

     ViewData["FeaturedProduct"] = featuredProduct; 
     return View(); 
    } 
} 

如何在視圖中使用的ViewData?

@{  
    var viewDataProduct = ViewData["FeaturedProduct"] as Product; 
} 
<div> 
    Today's Featured Product is! 
    <h3>@viewDataProduct.Name</h3> 
</div> 

什麼是視圖模型?

  • 允許從一個或多個數據模式或 源的多個實體捏成由視圖

它像優化用於消費和渲染單個對象

  • 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 
    

    結論

    • 通過使用視圖模型可以強類型數據傳遞到視圖
    • 但ViewData的是鬆散Typed.So需要在投數據查看
    • ViewModel可用於複雜場景,如合併多個 域模型
    • 但ViewData的只能用於簡單的場景,如將數據 的下拉列表
    • 視圖模型可以使用其 需要的UI
    • 但不能使用的ViewData對於此類驗證的基於屬性的驗證場景
    • 作爲最佳做法,總是嘗試使用強類型數據與 Views.ViewModel是最好的候選人。
  • +1

    我經常發現它更簡潔,可以將你需要的域模型作爲私有成員加載到ViewModel中,並公開你想要的通過屬性查看。此外,如果您將其設置爲適配器,則通過視圖模型返回的數據可以反過來保護隱藏域對象上的數據。 – Sinaesthetic 2014-01-03 19:06:58