2012-01-12 42 views
10

IEnumerable型をMVC POSTにモデルバインドする際に問題はありますか?ASP.NET MVC POSTでモデルバインディングIEnumerable?

私のモデルのいくつかのプロパティは、アクションの投稿にバインドされていません。文字列のようなモデルのプロパティは正常ですが、私のIEnumerableは束縛されていないものです。ここで

は、私のコードの抜粋です:

<%: Html.TextBoxFor(m => m.ResponseInfo.SubsetInfo.Test) %> 
    <% for (int i = 0; i < Model.ResponseInfo.SubsetInfo.BandAvailabilities.Count(); i++) 
    {%> 
     <%: Html.TextBoxFor(m => m.ResponseInfo.SubsetInfo.BandAvailabilities.ToArray()[i].BandName) %> 
    <% } %> 

そしてここでは、これらのプロパティがモデルにどのように見えるかです:

public IEnumerable<BandAvailabilityInfo> BandAvailabilities { get; set; } 
public string Test { get; set; } 

ビューが正常に動作し、期待してテキストボックスのリストを出力しますそれらの値。しかし、起動されるポストアクションは、テスト文字列をプロパティとして認識するだけです。モデル状態にはIEnumerableデータも含まれていません。

+0

によって処理されます

<%: Html.EditorFor(m => m.ResponseInfo.SubsetInfo.BandAvailabilities%> 

と残りの部分とループ全体を交換する必要が問題へのより良い洞察... – Arkiliknam

+0

私は確信していません。なぜ多くの良い質問が説明なしにdownvotedされています....私はこれを見つけたと便利な発見。ありがとう。 –

答えて

8

モデルバインディングは、生成されたhtmlの外観に依存します。ウル特定のシナリオが適切にHTMLをバインドするためには

<input type="text" name = "ResponseInfo.SubsetInfo.BandAvailabilities[0].BandName"/> 
<input type="text" name = "ResponseInfo.SubsetInfo.BandAvailabilities[1].BandName"/> 
<input type="text" name = "ResponseInfo.SubsetInfo.BandAvailabilities[2].BandName"/> 
. 
. 
<input type="text" name = "ResponseInfo.SubsetInfo.BandAvailabilities[n].BandName"/> 

のようになります。私はそれを試していないが、私は、ループ内のToArrayメソッドの呼び出しは、ネストされた入力に対する適切な名前を生成するからシステムを保っていることはほぼ確実です。あなたはこの ファーストを解決するために行うことができます物事のカップル、

public IList<BandAvailabilityInfo> BandAvailabilities { get; set; } //or Array 

にあなたのビューモデルチェンジで

public IEnumerable<BandAvailabilityInfo> BandAvailabilities { get; set; } 

がありますので、ループや固有名詞でToArrayメソッドを呼び出す必要はありません。入力用に生成されます。 次に、エディタテンプレートを作成し、現在のコントローラまたは共有フォルダのエディタテンプレートフォルダのエディタテンプレートフォルダに配置します。このビューにタイプBandAvailabilityInfoのモデルを受け入れ、このビューの名前もBandAvailabilityInfoにする必要があります。その後、自分のメインビューであなただけの、私は本当に同様の問題を持っていた誰かがこの質問を越えつまずくとなります願っていdownvotedされているにもかかわらず、フレームワーク自体

+0

ToArrayを使用しているかどうかにかかわらず、実際の配列であるかどうかはわかりませんが、実際の配列に変更すると問題が解決しました。 – Arkiliknam

+0

uは生成されたhtmlを調べて、それを確認できます –

0

IEnumarbleタイプで正常に動作します。
Forループ内に書いている問題はToArrayだと思います。 (非常に効率的ではありません)
forループをforeachに変更してください。

this優秀な答えを達成する方法を参照してください。

+0

forループを使用するのは、このTextBoxForを作成しているモデルのコレクションの要素を識別するために、Modelの述語パラメータを取るTextBoxForsを作成する必要があるためです。インデックスは、これらの要素を追跡する単なる方法です。 foreachループでは、要素がどこから来たのかのコンテキストを失います。限り、私はこの方法を知っている限り、特に速度をO(1)として、私は配列を使用して比較すると非効率的ではありません。 – Arkiliknam

関連する問題