2010-04-30 38 views
1

我再次遇到與LINQ to Sql和MVC Model Binder有關的問題。ASP.NET MVC 2:LINQ到SQL實體w/ForeignKey關係和默認ModelBinder奇怪

我有Sql的Linq生成的類,說明他們,他們看起來與此類似:

public class Client 
{ 
    public int ClientID { get; set; } 
    public string Name { get; set; } 
} 

public class Site 
{ 
    public int SiteID { get; set; } 
    public string Name { get; set; } 
} 

public class User 
{ 
    public int UserID { get; set; } 
    public string Name { get; set; } 
    public int? ClientID { get; set; } 
    public EntityRef<Client> Client { get; set; } 
    public int? SiteID { get; set; } 
    public EntityRef<Site> Site { get; set; } 
} 

「用戶」已與「客戶」和「網站 的關係。 User類具有可空的ClientID和SiteID,因爲管理員用戶沒有綁定到客戶端或站點。

現在我有一個視圖,用戶可以在其中編輯'用戶'對象,該視圖具有所有'用戶'屬性的字段。當表單提交,此時,相應的「保存」行動被稱爲在我的UserController的:

public ActionResult Save(User user, FormCollection form) 
{ 
    //form['SiteID'] == 1 
    //user.SiteID == 1 

    //form['ClientID'] == 1 
    //user.ClientID == null 
} 

在這裏的問題是,客戶端ID從未設置,它始終是空,即使值是的FormCollection。

爲了弄清楚出了什麼問題,我在Linq to Sql設計器生成的類中爲ClientID和SiteID獲取器和設置器設置了斷點。我注意到以下幾點: 正在設置SiteID,然後設置ClientID,但隨後客戶端EntityRef屬性被設置爲空值,而該值又將ClientID設置爲空!我不知道爲什麼以及試圖設置客戶端屬性的原因,因爲Site屬性設置器從不被調用,只有客戶端設置器被調用。

手動從的FormCollection設置客戶端ID是這樣的:

user.ClientID = int.Parse(form["ClientID"].ToString()); 

拋出一個「ForeignKeyReferenceAlreadyHasValueException」,因爲它已經被設置之前爲null。我發現唯一的解決方法是用自定義方法擴展生成的部分用戶類:

Client = default(EntityRef<Client>) 

但這不是一個令人滿意的解決方案。我不認爲它應該這樣工作?

請賜教某人。到目前爲止,Linq to Sql讓我瘋狂!我剛剛在同樣的問題與MVC 3運行

問候

回答

1

我想這是因爲模型綁定設置模型類的所有公共屬性,同時創造它。因此它將user.ClientID設置爲1,然後將user.Client設置爲null(因爲它在表單集合中不存在)。之後,user.ClientID的值也變爲null
所以你只需要從這樣的結合排除User類的Client屬性:

public ActionResult Save([Bind(Exclude="Client")]User user, FormCollection form) 

這爲我工作。