2010-08-19 21 views
1

我問,因爲我不能讓這個代碼工作。 我收到一個異常; 「無法更新'ITOC.WebUI.Models.Contract'類型的模型。」 這似乎不是很有幫助。MVC 2 UpdateModel - 它是如何工作的?

**編輯** 上述例外已解決,因爲前綴中存在拼寫錯誤,這是一種經典的「魔術字符串」。現在的問題是,沒有得到更新! ** END編輯**

我不得不承認我不清楚UpdateModel是如何工作的,我不清楚前綴是如何工作的。 viewmodel在網頁中指定;

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<ITOC.WebUI.Models.ContractViewModel>" %> 

和ViewModelClass是

public class ContractViewModel 
{ 
    //private ITOCEntities db = new ITOCEntities(); 
    public Contract contract { get; set; } 
    public IList<ContractType> contractTypes { get; set; } 
    public IEnumerable<SelectListItem> contractTypesSelectList 
    { 
     get 
     { 
      return this.contractTypes.Select(item => new SelectListItem 
      { 
       Text = item.ContractType1, 
       Value = item.ContractTypeId.ToString() 
      }); 
     } 
    } 


    public Contact clientContact { get; set; } 
    public Contact contractAdministratorContact { get; set; } 

    public ContractViewModel() 
    { 
     using (var db = new ITOCEntities()) 
     { 
      this.contractTypes = db.ContractTypes.ToList(); 

      this.clientContact = new Contact(); 
      this.contractAdministratorContact = new Contact(); 
      this.clientContact.ContactTypeId = 
       db.ContactTypes.Where(x => x.ContactType1 == "Client").SingleOrDefault().ContactTypeId; 
      this.contractAdministratorContact.ContactTypeId = 
       db.ContactTypes.Where(x => x.ContactType1 == "CA").SingleOrDefault().ContactTypeId; 
     } 
    } 
    public ContractViewModel(int contractId) 
    { 
     using (var db = new ITOCEntities()) 
     { 
      this.contractTypes = db.ContractTypes.ToList(); 
      this.contract = db.Contracts.Where(x => x.ContractId == contractId).SingleOrDefault(); 
      this.clientContact = 
       db.Contacts.Where(x => x.ContactId == this.contract.ClientContactId).SingleOrDefault(); 
      this.contractAdministratorContact = 
       db.Contacts.Where(x => x.ContactId == this.contract.ContractAdministratorContactId).SingleOrDefault(); 

     } 
    } 
} 

的控制器是;

[Authorize(Roles = "Inputter")] 
[HttpPost] 
public ActionResult Edit(int contractId, FormCollection formValues) 
{ 
    if (ModelState.IsValid) 
    { 
     using (var db = new ITOCEntities()) 
     { 
      var contract = db.Contracts.Single(x => x.ContractId == contractId); 
      string letter = contract.ContractNo_Letter; 

      UpdateModel(contract, "Contracts"); 

      var clientContact = db.Contacts.Single(x => x.ContactId == contract.ClientContactId); 
      UpdateModel(clientContact, "Contact"); 
      var contractAdministrationContact = 
       db.Contacts.Single(x => x.ContactId == contract.ContractAdministratorContactId); 
      UpdateModel(contractAdministrationContact, "Contact"); 
      db.SaveChanges(); 
     } 

     return RedirectToAction("List"); 
    } 
    return View(); 
} 
+0

你試過我建議的嗎? – hunter 2010-08-19 13:58:42

+0

是的,請參閱您的名下的評論。 – arame3333 2010-08-19 14:10:31

+0

我在想這個問題是前綴的名字。類的名稱是「Contract」,但是會引發異常,就像「contract」一樣。 「合同」不會引發異常,但不會更新。 – arame3333 2010-08-19 16:20:34

回答

3

嘗試使用TryUpdateModel一個if/else語句

if (TryUpdateModel(contract)) 
{ 
    // save changes 
} 
else 
{ 
    // handle 
} 

TryUpdateModelUpdateModel旨在用於合併的對象與發佈模型對象。

更新使用來自控制器的 當前值提供程序的值指定的模型實例 。

嘗試閱讀this post有關這兩種方法。


試着改變你的POST操作方法

[Authorize(Roles = "Inputter")] 
[HttpPost] 
public ActionResult Edit(ContractViewModel model) 
{ 
    // 
} 

匹配您的模型對象的表單匹配您ContractViewModel對象的屬性標識的再model將這些值後

+0

是的,當我這樣做時,其中一個對象屬性返回一個空異常。這是否顯示出問題所在,即使該字段不在表單中,我也必須使用必需的字段驗證程序填充每個字段? – arame3333 2010-08-19 14:10:11

+0

如果您在使用您使用的ID的窗體上隱藏輸入,則可以根據該ID加載該對象。然後調用UpdateModel(myloadedobject),它會合並提交頁面上的項目,並忽略不屬於的項目。 – hunter 2010-08-19 14:19:58

+0

我已將字段HiddenFor製作在我的表單上。但是,在Controller ModelView中,我仍然得到這些字段之一的空例外 – arame3333 2010-08-19 14:50:43

0

我注意到了幾件事:

  1. 您沒有在您的視圖中指定的ViewModel。在這裏這條線是指無類型具體型號一個觀點:在沒有看到視圖

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

  2. ,我們無法確定你想要什麼綁定到這裏,或者即使你應該使用一個前綴。

  3. 實際上並沒有將FormValues集合傳遞給UpdateModel。嘗試:UpdateModel(contract, "Contract", formValues)

+0

那裏有一個ViewModel – hunter 2010-08-19 13:31:02

+0

標記有一些有趣的地方。我試圖編輯它,但在編輯視圖中,標記是正確的! 所以你需要看到的是這個; <%@ Page Title =「」Language =「C#」MasterPageFile =「〜/ Views/Shared/Site.Master」 Inherits =「System.Web.Mvc.ViewPage 」%> – arame3333 2010-08-19 13:31:22

+0

我在發現bug後編輯了問題... – arame3333 2010-08-19 13:54:39

1

查看Controller.ModelState條目失敗的外觀。這會告訴你未能綁定的東西。根據我的經驗,通常它的數據類型不匹配。


CubanX的答案1和3對ModelBinding錯誤沒有任何影響。 2可以忽略,因爲如果你得到一個綁定錯誤,你知道它可能綁定,可能不必擔心前綴。

+0

Controller.ModelState只包含ContractId。你認爲這是問題嗎? – arame3333 2010-08-19 13:39:32

相關問題