1

我想保持模型綁定時,從我的看法做ajax調用。我使用jquery ajax打的電話,而只是作爲一個示例 - 這是我的控制器方法我想從AJAX調用:當涉及複雜類型時,如何處理ajax和模型綁定?

public ActionResult Create(Person personToCreate) { 
    //Create person here 
} 

正如你所看到的,這種方法依賴於Model Binding。這使得該方法更加清潔......但是,這意味着,當ajax發起調用時,它必須提供DB中不可空的所有變量。

所以,如果我有一個表稱爲Person有變量:

firstName varchar(25) not-null 
lastName varchar(25) not-null 
myPet  int   not-null <-- This is a foreign key 

然後實體框架類,Person,創建將類似於:

public class Person { 
    public string firstName { get; set; } 
    public string lastName { get; set; } 
    public Pet myPet { get; set; } 
} 

由於沒有一個變量可以爲空(如在DB中指定的),這意味着ajax調用必須提供string firstName,string lastName,Pet myPet。但JavaScript不能提供寵物...

所以我只有兩個選擇(據我所知):

  1. 允許myPet爲空在DB

  2. 創建一個「扁平化「類,表示不需要的寵物對象的人......

即:

public class SimplePerson { 
    public string firstName { get; set; } 
    public string lastName { get; set; } 
    public string myPetName { get; set; } 
} 

與第一選項的問題是,它似乎很奇怪有,因爲它使事情不應該是修改DB ...肯定有毛病吧......

與第二的問題選項是我有很多類,而且爲了避免這種情況,爲每個類編寫重複類似乎非常廣泛......如果我有30個類,那將是30個重複的類,我必須創建它們才能允許用於模型綁定。

任何人都可以想到更好的選擇,或給出推理爲什麼一個選項會比另一個更好?

回答

2

這裏真正的技巧是將視圖模型類從實際模型類中分離出來。視圖模型類往往更簡單一些,你需要先將它們映射回實際的模型類,然後再做一些真正的東西。像AutoMapper這樣的工具使得這個非常簡單。

+0

「將視圖模型類與實際模型類分開」,所以你說我應該簡化每個類的重複項? – Matt 2009-07-16 18:04:20

+0

是的,爲了映射進出窗體等而虛弱了下來。 – 2009-07-17 12:42:12