2012-10-10 50 views
0

根據我昨天詢問的問題,我試圖找到一種動態創建更多文本框的方法,並將這些映射到我的視圖模型,以便在發佈到服務器時它將全部動態獲取(js)生成文本框並將其發佈到諸如List之類的對象。發佈到控制器的PetaPoco複雜類型

爲了讓這個混亂的問題的一個例子:

我有一個標有「主要聯繫人」文本框和票據創建者可以輸入聯繫人姓名和電話號碼在此框中。我想要做的基本上是,切換到三個文本框。一個用於名稱,電子郵件和電話號碼而不是一個框。然後,我將創建一些JavaScript,它將動態創建另外三個框,以將另一個聯繫人添加到此List集合中。然後,當用戶提交表單以修改或創建工單時,它會將模型內的集合傳遞給控制器​​。但是,Petapoco有點令人困惑。讓我告訴你的控制器:

[HttpPost] 
public ActionResult ModifyTicket(Ticket model) 
{ 
    string userString = User.Identity.Name.Replace("ONHOLD\\", ""); 
    if (ModelState.IsValid) 
    { 
     model.CreatedDate = DateTime.Now; 
     model.LastUpdateBy = Util.GetEmployeeIdByName(userString); 
     model.LastUpdate = DateTime.Now; 
     model.IsComplete = false; 
     model.ClientString = Util.GetClientNameById(model.ClientId); 
     model.LocationString = Util.GetLocationNameById(model.LocationId); 

     model.Update(); 

     SuccessMessage = "You have successfully updated ticket number: " + model.TicketId + " for the following client: " + model.ClientString + "."; 
     return RedirectToAction("Index"); 
    } 
     ErrorMessage = "Woops! Something went wrong, please check back in a few moments, if the problem persists please contact development."; 
     return RedirectToAction("Index"); 
} 

簡單的答案,這將是我的數據庫模型將包含一個List對象爲這個確切原因。但是,我正在使用PetaPoco,我不完全確定它將如何完成。我可以手動將集合添加到我的數據庫模型中,但是當我根據任何數據庫模式更改重新生成模型時,我將失去對該文件所做的任何更改。

我還使用了我的視圖使用DataAnnotations進行驗證的部分類。然而,這個類與它僅包含用於提供客戶端驗證的DataAnnotations的數據庫模型相同。

如果有人瞭解我想要完成的任務,我會非常樂意提供更多信息來澄清任何缺失的部分。我只需要一個解決方案,因爲我找不到解決此問題的堅實途徑!

回答

1

不完全確定您的意思,但您可能已經知道這很容易to model bind from/to a list with MVC。至於保存這樣的深層對象,我會在Ticket.List中使用[Ignore]屬性,這樣它就不會被持久化並分開處理。我會從Ticket對象中單獨加載聯繫人,然後手動將它們添加到Ticket對象,或者使用聯接查詢並嘗試一對多方法一次性加載它。

我認爲您期待Petapoco全部更新爲一體嗎?這不會發生,你需要分解它。很難從迄今爲止所寫的內容中說出。將不會有一長串聯繫人(從它的聲音),所以只需插入或逐一更新它們。

那麼這可能會有所幫助,或者可能不會。