2017-02-11 39 views
2

我是新來MVC5,只是想掌握使用的ViewModels的。我的問題是如果我必須在我的ViewModel的控制器中實例化我的模型類。我正在製作一個數據庫來組織賬單,並且有一個映射到數據庫表的Cash模型和一個用於查看/編輯數據的CashViewModel。我是否需要在MVC5的ViewModel中實例化Model類?

這裏是我的模型:

public class Cash 
{ 
    public int CashId { get; set; } 
    public decimal CashAmount { get; set; } 
    public int CashTypeId { get; set; } 
    public DateTime DateModified { get; set; } 
    public CashType CashType { get; set; } 
} 

這裏是我的ViewModel:

public class CashViewModel 
{ 
    public int CashId { get; set; } 
    public decimal CashAmount { get; set; } 
    public int CashTypeId { get; set; } 
    public SelectList CashTypeSelectList { get; set; } 
} 

這裏是我的控制器:

public ActionResult Create([Bind(Include = "CashAmount,CashTypeId")] CashViewModel cashVM) 
    { 
     if (ModelState.IsValid) 
     { 
      var cash = db.Cashes.Create(); 
      cash.DateModified = DateTime.Now; 
      cash.CashAmount = cashVM.CashAmount; 
      cash.CashTypeId = cashVM.CashTypeId; 
      db.Cashes.Add(cash); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     ViewBag.CashTypeId = new SelectList(db.CashTypes, "CashTypeId", "CashTypeName", cashVM.CashTypeId); 
     return View(cashVM); 
    } 

我創建了現款車型的一個實例並將我的ViewModel類映射到我的模型類。它是否正確?當我開始在一個ViewModel中有多個具有多個屬性的模型的項目時,這看起來很快就會失控。

所有的問題,我看文章是不是太模糊或過於詳細,如果有一些已經在那裏我找不到任何我的具體問題,不好意思。

+0

你的行爲是否正確。請參閱[什麼是MVC中的ViewModel?](http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc)。然而,刪除你的'ViewBag.CashTypeId = new SelectList(....)'並用'cashVM.CashType = new SelectList(db.CashTypes,「CashTypeId」,「CashTypeName」);'(注意不是第4個參數) - 在視圖中應該是'@ Html.DropDownListFor(m => m.CashTypeId,Model.CashType,...)' –

回答

2

的ViewModels基本上都是提供視圖和控制器,它看起來像你這樣做之間的DTO。然而,您的模型看起來不正確,因爲您應該只有CashType,而不是CashTypeId,因爲CashType模型具有Id和Cash對其的引用。同時存在的問題是他們不保持同步,我甚至不記得哪一個EF選擇權威。

除此之外,它看起來像你已經想通了。您的ViewModel具有一個SelectList,其中包含要呈現的視圖的值,以及一個用於客戶端的CashTypeId以將值分配給。如果您的主實體沒有CashTypeId,您必須創建一個新的CashType對象併爲其分配正確的ID(假設這是實體框架)。

最後一個忠告:不要在你的控制器做這些DB操作。看看repository pattern,甚至可以在它們之間建立一個業務層。

+0

感謝您的回覆。我一直在閱讀Wrox專業ASP.NET MVC 5書,通過MVC Music Store示例,他們一直在使用外鍵ID在數據庫中創建外鍵關係。我只是測試了你對某些測試類所說的內容,並在另一個設置中引用了一個模型中的外鍵關係... TIL。爲了跟進存儲庫,他們有基本的CRUD功能,但是我需要將我的viewmodel數據映射到所有模型以更新規範化表格嗎? – Andy

+0

您的存儲庫只能處理模型/實體。 ViewModels不應該存在於ASP.NET MVC項目之外。所以是的,你需要將ViewModel映射到Model。有一個名爲AutoMapper的軟件包可以幫助解決這個問題,儘管我沒有親自使用它。 –

1

我正在創建一個Cash模型的實例,並將我的ViewModel類映射到我的模型類。它是否正確?當我開始在一個ViewModel中有多個具有多個屬性的模型的項目時,這看起來很快就會失控。

沒有什麼錯,你在做什麼。但是,對於從您的域模型到視圖模型(視圖模型)的映射,您可以使用庫爲您執行映射。我使用AutoMapper。想象一下,你有這樣的:

public class Cash { 
    public string Prop1 { get; set; } 
} 

public class CashViewModel { 
    public string Prop1 { get; set; } 
} 

在你Application_Start() start方法,可以指示AutoMapper如何從你的域模型映射到你的模型像這樣的觀點:

protected void Application_Start() 
{ 
    // ReverseMap will do vice-versa mapping 
    // If property names are the same, then AutoMapper will take care of it 
    // for you. 
    Mapper.Initialize(x => x.CreateMap<Cash, CashViewModel>().ReverseMap()); 

    // Of course you will have many cases where the property names 
    // are different 
    // For that case you will need to do this 
    // Imagine your model has a property called Name and view model has 
    // FirstName 
    Mapper.CreateMap<CashViewModel, Cash>() 
      .ForMember(model => model.Name, map => map.MapFrom(vm => vm.FirstName)); 
} 

然後在你的控制器,你只是這樣做,從一個視圖模型轉換成域模型:

var model = Mapper.Map<Cash>(cashViewModel); 

這種方法的好處是,所有你的映射會在一個地方。總之,here是一篇很好的文章,涵蓋了大部分您正在尋找的內容以及更多內容。

相關問題