簡體   English   中英

ASP.NET MVC:如何處理具有許多屬性的視圖模型?

[英]ASP.NET MVC: How do I handle a view model with many properties?

所以我有幾乎1:1的視圖比例來查看模型,事情似乎進展順利。 如果我正確理解他們的目的,那么看起來應該是視圖模型

  1. “刪除”實體模型,以便只將相關屬性傳遞給表示層
  2. 在創建地址時添加演示文稿所需的其他信息,例如州名縮寫列表或聯系人類型。

在努力遵守這些原則時,我的報告控制器有點像牆。 為客戶生成的各種報告需要訪問大約30個左右的不同屬性。 因此,我的視圖模型最終看起來與我的實體模型非常相似。

當然,最簡單的解決方案是將實體模型傳遞給視圖,這樣我就可以訪問所有屬性,但是我還需要能夠為空白或“不完整”的客戶生成報告。 這會導致問題在嘗試訪問我的Entity模型上的導航屬性時將引用異常。

所以我可以對視圖中的每個字段使用空檢查,這看起來不太吸引人......或者我可以實現視圖模型以避免空引用異常。 問題是我最終得到了一個看起來像這樣的視圖模型:

var customer = customersRepository.GetCustomer(id);
var viewModel = new CustomersViewModel()
{
    FirstName = customer.FirstName,
    LastName = customer.LastName,
    Address = customer.MailingAddress.Address,
    City = customer.MailingAddress.City,
    // and on and on for about 30 different properties
};
return View(viewModel);

輸入所有這些屬性是其中一個感覺錯誤的事情。 我錯過了一個更優雅的解決方案嗎?

問題是我最終會得到一個看起來像這樣的視圖模型

AutoMapper是必須避免編寫您發布的代碼的必要條件。 我還建議你觀看優秀的控制器來自AutoMapper的創建者的飲食視頻。 觀看完這段視頻后(以及您身邊的一點努力),您的控制器動作將減少到一個漂亮的一個班輪。

你一定要看看AutoMapper( http://automapper.codeplex.com/ )。

AutoMapper.Mapper.CreateMap(typeof(CustomersModel), typeof(CustomersViewModel));

AutoMapper.Mapper.CreateMap<CoolObject, CoolObjectViewModel>()
    .ForMember(d => d.Property1, f => f.MapFrom(s => s.Property1))
    .ForMember(d => d.Property2, f => f.MapFrom(s => s.Property2))
    .ForMember(d => d.Property3, f => f.MapFrom(s => s.Property3));

輸入所有這些屬性是其中一個感覺錯誤的事情

對於你想要的級別,最終你必須輸入所有級別。

所以,我認為這種方法同樣可以。

我真的沒有得到你想要在這里實現的東西..編寫更多代碼沒有任何問題..只要它是具體和有條理的,你的代碼大小無關緊要。 您應該擔心的是如何減少數據庫交互,從數據庫中僅檢索所需的屬性。

因為您的代碼顯示您檢索整個客戶對象,然后最終顯示一些屬性,為什么不檢索您需要的屬性。

此外,如果您使用郵件地址的屬性,為什么不將整個mailingaddres對象作為屬性傳遞給您,為什么要拆分為其他屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM