2010-12-11 8 views
3

Phil Haackが投稿したコードを使用して、2つ以上のコレクションを結んでいる人は誰ですか?Model Binding To A List2つ以上のコレクションを束縛するモデル

例として、以下のコードがあります。

public class Book { 
    public string Name { get; set; } 
} 
public class Author { 
    public string Name { get; set; } 
} 


public ActionResult Index(List<Book> books, List<Author> authors) { 
    // Will never model bind two collections. 
} 

私が持っているHTMLは次のとおりです。

<input type="hidden" name="books.index" value="1" /> 
<input type="text" name="books[1].Name" /> 

<input type="hidden" name="books.index" value="2" /> 
<input type="text" name="books[2].Name" /> 

<input type="hidden" name="authors.index" value="1" /> 
<input type="text" name="authors[1].Name" /> 

<input type="hidden" name="authors.index" value="1" /> 
<input type="text" name="authors[1].Name" /> 

私が手に例外がある:

パラメータ辞書は、パラメータ「本手法のための「システムの無効なエントリが含まれています.Web.Mvc.ActionResult Index(System.Collections.Generic.List 1[Book], System.Collections.Generic.List 1 [著者]) '' HomeController '。辞書には、 'System.Collections.Generic.List'タイプの値が含まれています。1[Book]', but the parameter requires a value of type 'System.Collections.Generic.List 1 [著者] '。パラメータ名:パラメータ

私は間違ったことをしていますか、これはASP.NET MVCではサポートされていませんか?

+0

リストを使用しているので、インデックス値を格納するために非表示フィールドは必要ありません。また、インデックスは0から開始する必要があります。 –

+0

ブログによると、新しいアイテムを削除または動的に追加する場合は、インデックス値を格納するために非表示フィールドを使用する必要があります。私のビューはアイテムを削除できるので、私は隠しフィールドが必要です。 –

+0

アクションメソッドから1つのパラメータを削除すると、もう1つは問題なくバインドされます。たとえば、アクションメソッドからauthorsパラメータを削除した場合、booksパラメータは正しくバインドされます。 –

答えて

3

問題はどこか他の場所で発生しました。再現できませんでした。以下は、私のために正常に動作します:

モデル:

public class Book 
{ 
    public string Name { get; set; } 
} 
public class Author 
{ 
    public string Name { get; set; } 
} 

コントローラー:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Index(List<Book> books, List<Author> authors) 
    { 
     return View(); 
    } 
} 

ビュー:

<% using (Html.BeginForm()) { %> 
    <input type="text" name="books[0].Name" value="book 1" /> 
    <input type="text" name="books[1].Name" value="book 2" /> 

    <input type="text" name="authors[0].Name" value="author 1" /> 
    <input type="text" name="authors[1].Name" value="author 2" /> 

    <input type="submit" value="OK" /> 
<% } %> 

それが正常に戻ってPOSTアクションに値をバインドします。


UPDATE:

私は、これはRTMで修正される予定bug in ASP.NET MVC 3 RC2であることを確認してください。この問題を回避するには、Application_Startに次のように入力します。

ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider(); 
+0

あなたは正しいです。空のソリューションでは、正常に動作します。シャープアーキテクチャーのモデルバインダーに問題があると思っています。私は現時点で問題を分離しようとしています。 –

+0

上記のコードを新しいソリューションで試してみたところ、同じエラーが発生しているので、ASP.NET MVC3 RC2で問題が発生しているようです。 –

+0

@Husain、そうです。これはASP.NET MVC 3 RC2のバグのようです。私はそれを再現することができます。私は、これがなぜ起こるのか非常に興味があり、付属のリリースノート文書の「変更を破ってください」のセクションで何の情報も見つけられませんでした。 –

関連する問題