2010-04-15 29 views
1

我將一些常見屬性重構爲基類,並立即啓動了模型更新失敗。 UpdateModel()和TryUpdateModel()似乎沒有更新繼承的公共屬性。ASP.NET MVC UpdateModel - 字段與屬性?

我無法在MSDN和Google上找到關於這些方法的規則或語義的詳細信息。該文檔是簡潔(http://msdn.microsoft.com/en-us/library/dd470933.aspx),簡單的聲明:

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

解決:MVC.NET的確處理繼承的屬性就好了。事實證明,這與繼承無關。我的基類是用公共字段實現的,而不是屬性。切換到正式屬性(添加{get; set;})是我所需要的。這讓我很難受,我一直想用簡單的公共領域。我認爲字段和屬性在語法上是相同的,對於類的用戶可以認爲它們在語義上是等價的。

回答

1

MVC將綁定到繼承類的屬性。模型聯編程序調用類似於typeof(yourtype).GetProperties()的方法,它可以返回所有繼承的成員。

只測試了它:

public class PersonBase 
{ 
    public string Name { get; set; } 
} 

public class User : PersonBase 
{ 
    public string FavoriteFood { get; set; } 
} 

「我的假設是方法反映只有一流的,」

如何將這項工作? 「頂級」類也是基類。

+0

感謝您確認我的問題在其他地方。看我的編輯。是的,用GetProperties()反射正是問題,與GetFields()相反。我期望看到模型綁定更新公共屬性和字段,因爲屬性是用於僞裝成字段記法的語法糖。但是,這是我缺乏MVC.NET知識。現在我知道了,它很簡單,但我不確定我喜歡分化。 – codenheim 2010-04-15 20:36:21

+0

>>「頂級」類也是基類。 我的意思是底部,對不起,打字速度很快......我應該說葉類。 – codenheim 2010-04-15 20:37:27

1

這個讓我很好奇。 我犯了一個編輯表單一類Manager誰再從Person 派生(畢竟,經理人太:-))

在這種操作方法

public ActionResult Edit(Manager manager) 
     { 
      return View(manager); 
     } 

其沃斯從視圖稱爲與Manager(派生類型)作爲強類型模型變量,當懸停經理變量,它顯示我的基類(它實際上是說:基地:Person)和一個額外的屬性爲經理

嘗試formcollection噸oo,這也是有效的:

public ActionResult Edit(FormCollection formCollection) 
     { 
      Manager manager = new Manager(); 
      UpdateModel(manager); 
      return View(manager); 
     } 
+0

啊,只有現在我讀了你使用formcollection可能? – Michel 2010-04-15 20:12:07

+0

好的,formcollection似乎也有效。 – Michel 2010-04-15 20:14:35

+0

看到我上面的編輯,我終於意識到,基類有公共領域,而不是屬性。我想將公共領域視爲屬性,在語義上,他們應該是這樣,但模型綁定忽略領域,看來。 – codenheim 2010-04-15 20:30:56