2017-02-10 58 views
2

我有一個大的實體(組織),我已經將一些字段分成單獨的視圖,其中包含多個ViewModel的較小字段子集。如果用戶稍後需要更新這些字段,我也想使用這些相同的視圖。如何使用視圖模型從視圖編輯

我很困惑我該如何填充數據。例如,我(可能愚蠢)認爲,如果我使用整個實體填充Get,那麼字段將自動填充 - 就像我使用與整個實體關聯的編輯視圖一樣。

有人可以告訴我,ViewModels不應該用這種方式,或者如果我只是沒有想到明顯的東西?

這是我目前的獲取/發佈基於我(可能很差)的假設。 CompanyInfo是Organization內部字段的子集。這給了我令人沮喪的「動態代理」錯誤。

// GET: /Organization/CompanyInfo 
public ActionResult CompanyInfo(ManageMessageId? message) 
{ 
    ViewBag.StatusMessage = 
    message == ManageMessageId.ConfirmEmail ? "Please confirm your email address to log in again." : ""; 

    var member = GetUserMember(); 
    var org = db.Organizations.Single(x => x.OrgId == member.OrgId); 

    return View(org); 
} 

// 
// POST: /Organization/CompanyInfo 
[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> CompanyInfo(CompanyInfoViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     var member = GetUserMember(); 
     var org = await db.Organizations.SingleAsync(x => x.OrgId == member.OrgId); 
     org.StreetAddress = model.StreetAddress; 
     org.Suite = model.Suite; 
     org.City = model.City; 
     org.State = model.State; 
     org.Zip = model.Zip; 
     org.Country = model.Country; 
     db.Entry(org).State = EntityState.Modified; 
     db.SaveChanges(); 
     return RedirectToAction("CompanyInfo", "Organization"); 
    } 
    return View(); 
} 
+1

Your CompanyInfo操作應該返回CompanyInfoViewModel而不是db實體本身。您應該使用您的組織數據來創建此虛擬機並將其返回查看。您的發佈操作看起來很好。 –

回答

0

在ASP.NET MVC有一個視圖模型唯一真正的問題是,當你將它張貼回來,你不知道什麼性質已經被查看,因爲稀少,因爲你的狀態,你只能是在各種視圖中填充它們的一部分。理想情況下,您應該遵循的模式是,每個視圖都有一個ViewModel(並且作爲對該帖子的第一條評論,您應該將該模型傳遞給視圖以開始)。

你一定會發現你的方法存在問題的一個問題是使用內置的帶註釋驗證,因爲每個View都有不同的驗證要求,因爲它們處理實體的不同部分。

另外我想提一提的是,當我們談論ASP.NET MVC中的ViewModel時,我們並不是談論與基於XAML的UI框架中的ViewModel相同的東西,甚至是像Knockout或Angular 2這樣的JavaScript庫。那些ViewModel的可以在視圖和甚至應用程序之間共享,因爲它們存在於客戶端上:它們可以在消費時間對視圖執行業務邏輯。

0

你的問題是,你的CompanyInfo(ManageMessageId? message)操作方法返回db.Organizations.Single(x => x.OrgId == member.OrgId),我敢打賭,是Organization型(或某事),但絕對CompanyInfoViewModel型的不

你應該做的是在org對象數據中的第一個方法中創建一個CompanyInfoViewModel


在這種情況下使用視圖模型是可以接受的,儘管在這種情況下它們通常被稱爲DTO。 (數據傳輸對象)我通常將它們命名爲____ViewModel用於任何View動作,____EditModel用於Edit動作等。它們不是只是ViewModelViewModel對象,它們也用於其他操作。 (有時我們有確實是複雜的事情要做自己的DTO。)