2009-01-16 51 views
1

我有一個表單,其中包含一個完整的數據輸入字段的堆,將由用戶完成,包括一些元素,用戶可以指定他們將輸入多少相同的項目。這正如Phil Haack的博客文章Model Binding To A List中所使用的那樣。傳遞控制器一個FormCollection和一個IList <T>

我成功地使用JQuery來創建額外的表單元素,正確索引,等我的問題是實際閱讀我的控制器內的這些最好的方法。本文中的控制器只需要一個對象,即​​,而我的控制器已經期望FormCollection form,現在我正在嘗試將其也發送給IList<Itmes>

我應該將此添加到控制器所期望的參數還是通過表單[「items」]或其他方式訪問?

查看

<form action="/MyItems/Add" method="post"> 
    <input type="text" name="Title" value="" /> 

    <input type="hidden" name="myItem.Index" value="0" /> 
    <input id="item[0].Amount" name="item[0].Amount" type="text" value="" /> 
    <input id="item[0].Name" name="item[0].Name" type="text" value="" /> 

    <input type="hidden" name="myItem.Index" value="1" /> 
    <input id="item[1].Amount" name="item[1].Amount" type="text" value="" /> 
    <input id="item[1].Name" name="item[1].Name" type="text" value="" /> 
</form> 

控制器

public ActionResult Add(FormCollection form) 
{ 
    string Title = form["Title"]; 
    List<Item> Items = form["items"].ToList(); 
} 

DTO

public class Item() 
{ 
    int Amount {get; set; }; 
    string Name {get; set; }; 
} 
+0

Scott Hanselman與此相關的[博客文章](http://stackoverflow.com/questions/449138/passing-controller-a-formcollection-and-an-ilistt/450176#450176)。 Phil Haack的[博客文章](http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx)在發佈列表時也非常有用(正如原始問題中提到的那樣)。 ) – 2010-09-09 02:38:25

回答

1

我決定與FormCollection專門合作,而不是使用FormCollection和其他數據通過框架映射到List的某些數據混淆水域。下面的代碼將手動輸入項目並對DTO進行水合。這很好地工作,並允許我在我的代碼中做一些不可能直接映射到List的其他東西。

List<Item> itemList = new List<Item>(); 
int i = 0; 

while (form["item[" + i + "].Amount"] != null) 
{ 
    itemList.Add(new Item() 
     { 
      Amount = Convert.ToInt32(form[String.Format("item[{0}].Amount",i)]), 
      Name = form[String.Format("item[{0}].Name",i)] 
     }); 
} 
1

你可以只添加myItem爲p像這樣的參數:

public ActionResult Add(FormCollection form, List<Item> myItem) 
{ 
} 

然後,它將自動從表單數據綁定並填充myItem參數。

+0

我會給另一個去。我試過,但不斷得到一個「對象引用未設置爲對象的實例。」錯誤,所以假定它不會自動綁定,如果我也使用FormCollection。 – dave 2009-01-16 01:44:01

0

我沒有試過這個,所以你必須給它一個去,但爲什麼不使用UpdateModel或TryUpdateModel方法?這應該與將IList傳遞給控制器​​的操作相同。

即:

public ActionResult Add(FormCollection form) 
{ 
    List<Item> items = new List<Item>(); 
    TryUpdateModel(items, form); 
} 

我不是在我的開發計算機,所以我不知道它會工作,但我相信它應該。讓我知道,如果這是你需要的。

編輯:值得注意的是,如果您使用的是實體框架,我遇到了UpdateModel方法的許多問題,並訴諸寫我自己的。

相關問題