2009-02-12 54 views
5

我有一個場景卡住了 - 我有一個域對象,有一個對象集合附加到它。類似這樣的:ASP.NET MVC - 以一種形式處理多個對象

public class Person 
{ 
    public string Name { get; set; } 
    public IList<PhoneNumber> PhoneNumbers {get; set; } 
    public IList<Address> Addresses { get; set; } 
} 

客戶需要的UI具有用於添加和編輯的單一輸入表單。用戶可以爲每個人輸入0到許多電話/地址。如何處理將值集合發回給控制器?

我可以想到幾種方法,但他們都似乎蠻力而不是非常優雅。處理這類問題是否有最佳做法?

回答

0

在過去,我已經使用了這個標準。

<input name="Parent[childObjectType][serial_number]" type="textbox" value="" /> 

因此,對於你的情況這

<input name="Person[PhoneNumber][1]" type="TextBox" value="555-1212" /> 
<input name="Person[PhoneNumber][2]" type="TextBox" value="555-555-1212" /> 

,您可以增加序列號和複製JavaScript中的元素以獲得多個,並使用你的行動的FormCollection,這將給你一個辦法得到這些元素。

來自mvc團隊的默認設置是使用ModelBinder和此操作的點語法。 但是,這使得jQuery和其他JavaScript框架阻止。

0

我已經開始使用json和jQuery在服務器端使用JSON.NET和JsonFilter將複雜類型發佈到控制器動作,該動作會自動將您的json對象並將其序列化爲等效的C#類型。我發現這是一個非常乾淨的解決方案,更容易測試。您可以通過下載示例代碼查看該帖子,以瞭解如何執行此操作。這非常簡單。

http://blogger.forgottenskies.com/?p=252

3

它是由框架,通過使用一種特殊的「形式佈局」的支持。菲爾哈克有這方面的一篇文章,check this out

編輯斯科特Hanselman(http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx)剛剛發佈了此更新。此外,在RC1中,似乎(昨晚碰到了這個mysel)索引需要以0爲基礎並穩步增加(至少如果你對IList有「約束力」)

Edit2鏈接似乎沒有工作

0

在提到的Hanselman的文章中,他寫道,你不需要索引,你只需要輸入框的名稱相同,並有一個數組參數在行動,它的工作原理。