2011-03-17 60 views
0

我有一個名爲Project的模型,它具有以下屬性(爲簡潔起見簡化)。MVC2 ModelBinder不綁定到模型的'id'屬性

[DataContract(IsReference = true)]  
public class Project 
{ 
    [Key] 
    [DataMember] 
    public int id { get; set; } 

    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    public DateTime CreatedDate { get; set; } 
} 

該模型也是使用實體框架4查詢數據存儲的WCF服務的數據合同。該模型的代碼由一個模板生成,該模板根據實體框架模型自動生成一個CRUD服務層。

現在,我的MVC2應用程序有一個包含窗體來編輯字段的視圖。控制器「編輯」操作在POST後接受整個模型作爲參數。

[HttpPost]  
public ActionResult Edit(Project project)  
{   
    var context = new ServiceContext();    
    try    
    { 
     if (ModelState.IsValid) 
     { 
      project = context.UpdateProject(project); 
      return RedirectToAction("Index"); 
     }   
    }   
    catch 
    { 
     ModelState.AddModelError("", "Could not save project");    
    } 

    return View(project);  
} 

現在,我的問題是,當表單發送到控制器,該項目模型具有所有的字段正確填充除了的「身份證」屬性,缺省值爲0

我做了一些挖掘和與谷歌大叔懇求答案,但我能得到的最接近的修復是以下添加到模型中的類,

[Bind(Include="id")] 

,工作正常,但只填充「身份證」屬性, 意思是我將不得不明確指定要包含在模型綁定中的每個屬性。顯然,這可能會變得很討厭,特別是因爲模型本身比我上面顯示的更多屬性更多。

是否有其他方法可以使此工作?

直覺是[鑰匙]屬性與它有關,但我一直沒能弄清楚什麼。

表單具有'id'屬性的隱藏輸入。

<%: Html.HiddenFor(model => model.id)%> 

回答

0

我想我已經找到了解決辦法。

我的模型也有一些複雜的屬性映射到我的實體框架模型中的相關表。現在,由於我使用自追蹤實體T4模板來生成我的服務層,因此在將值映射到實體時它有一些額外的邏輯。在這種情況下,複雜的特性之一是一類叫做狀態看起來像這樣:

public class Status 
{ 
    public int ProjectId { get; set; } 
    public int StatusId { get; set ; } 
} 

的專案編號是外鍵的項目表中數據存儲區。我注意到在模型綁定過程中ProjectId字段也被設置爲0。

當我增加了以下我的看法

<%: Html.HiddenFor(model => model.Status.ProjectId) %> 

兩個字段必須張貼到控制器的正確值。

問題解決了:)

感謝swapneel對此事你的看法。

1

嘗試添加附加隱藏字段爲ID等<%:Html.HiddenFor(型號=> model.Id)%>

+0

謝謝,它已經是表單上的一個隱藏字段(忘記顯示在我原來的問題上)。它仍然無法正常工作... – tobias86 2011-03-17 09:49:31

+0

通過刪除[Key]屬性 - mvc post ID中的viewmodel – swapneel 2011-03-17 10:09:52

+0

不,它不。但它讓我走上了正軌。謝謝!請參閱下面的答案 – tobias86 2011-03-17 10:50:32