2017-02-09 13 views
0

どのようにして、フォーム提出によってActionResultパラメータにネストされたデータを投稿できますか? 私はthis questionへの答えに似たソリューションを実装しようとしてきましたが、多くの運がないわけではありません。投稿された複雑な構造をMVCにキャッチするには

次のように問題のフォームのセクションが構成されています

<form method="post" action="/Product/Edit" class="tabs"> 
    <input name="Prices[1].Price" id="Prices_1__Price" value="9.99" type="text"> 
    <input name="Prices[1].Size2Price" id="Prices_1__Size2Price" value="0.00" type="text"> 
    <input name="Prices[1].Size3Price" id="Prices_1__Size3Price" value="0.00" type="text"> 
    <input name="Prices[2].Price" id="Prices_2__Price" value="5.00" type="text"> 
    <input name="Prices[2].Size2Price" id="Prices_2__Size2Price" value="0.00" type="text"> 
    <input name="Prices[2].Size3Price" id="Prices_2__Size3Price" value="0.00" type="text"> 
    <input name="Prices[3].Price" id="Prices_3__Price" value="0.00" type="text"> 
    <input name="Prices[3].Size2Price" id="Prices_3__Size2Price" value="0.00" type="text"> 
    <input name="Prices[3].Size3Price" id="Prices_3__Size3Price" value="0.00" type="text"> 
    <button type="submit">submit</button> 
</form> 

これは期待通りに表示ポストされたデータで、ログの罰金に貫通して来ている:モデルで

Form Submission Event: (BaseController:57-ish): 
{ 
    ... 
    "Prices[1].Price": "9.9900", 
    "Prices[1].Size2Price": "0.0000", 
    "Prices[1].Size3Price": "0.0000", 
    "Prices[2].Price": "5.5800", 
    "Prices[2].Size2Price": "0.0000", 
    "Prices[2].Size3Price": "0.0000", 
    "Prices[3].Price": "0.0000", 
    "Prices[3].Size2Price": "0.0000", 
    "Prices[3].Size3Price": "0.0000", 
    ... 
} 

私は価格のコレクションをキャッチしようとするバリエーションを試してきましたが、現在の試みは次のとおりです:

コントローラ側では3210

私は「EditedProductEntry」のデータ構造を受け取り、「編集」のActionResultを持っている:

[HttpPost] 
[Route("Edit", Name = "Product_Edit")] 
public ActionResult Edit(EditedProductEntry post) 
{ 
    ... 
} 

私は「ポスト」パラメータの構造は、それが「価格を受け入れる持ってしようとすると約いじってきました"コレクションが、これは私が困惑しています。残りのデータは、&が「EditedProductEntry」オブジェクトにデータを入力していますが、コレクションは残りのnullを解決しています。私は、オブジェクト[]をキャッチしようとした

は、EditedProductEntry []は、ICollectionを、IEnumerableを&も「編集」アクションに追加するパラメータとしてこれらを指定して試してみましたが、これまでのところ、私はすべての運を持っていませんしました。

誰にも他のアイデアはありますか?

+2

1の代わりに0からインデックスを開始するか、モデルバインディングコレクションに非連続インデックスバインディングを使用する - http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx /。私は2番目の方法をお勧めします – Developer

+1

DataContractとDataMember属性は必須ではありません(おそらく、コードにノイズを加えるだけです)。 –

+0

入力を手動で生成するのは狂気です。それらが既存のアイテムである場合は、[この回答](http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943#30094943)を参照してください。 thewビュー、参照してください[この回答](http://stackoverflow.com/questions/28019793/submit-same-partial-view-called-multiple-times-data-to-controller/28081308#28081308) –

答えて

1

ローカルマシンで同じケースを試してみましたが、コントロール名のインデックスが正しくないことがわかりました。

コントロール名は、ゼロベースのインデックスの後ろにある必要があります。

入力コントロールは次のように宣言する必要があります。

<input name="Prices[0].Price" id="Prices_1__Price" value="9.99" type="text"> 
<input name="Prices[0].Size2Price" id="Prices_1__Size2Price" value="0.00" type="text"> 
<input name="Prices[0].Size3Price" id="Prices_1__Size3Price" value="0.00" type="text"> 
<input name="Prices[1].Price" id="Prices_2__Price" value="5.00" type="text"> 
<input name="Prices[1].Size2Price" id="Prices_2__Size2Price" value="0.00" type="text"> 
<input name="Prices[1].Size3Price" id="Prices_2__Size3Price" value="0.00" type="text"> 
<input name="Prices[2].Price" id="Prices_3__Price" value="0.00" type="text"> 
<input name="Prices[2].Size2Price" id="Prices_3__Size2Price" value="0.00" type="text"> 
<input name="Prices[2].Size3Price" id="Prices_3__Size3Price" value="0.00" type="text"> 

したがって、ログファイルには次のデータも含まれます。

"Prices[0].Price": "9.9900", 
"Prices[0].Size2Price": "0.0000", 
"Prices[0].Size3Price": "0.0000", 
"Prices[1].Price": "5.5800", 
"Prices[1].Size2Price": "0.0000", 
"Prices[1].Size3Price": "0.0000", 
"Prices[2].Price": "0.0000", 
"Prices[2].Size2Price": "0.0000", 
"Prices[2].Size3Price": "0.0000", 

この変更を行うと、問題が解決するはずです。

+0

ああ、すべての人に感謝します。あなたはインデックス作成については正しかった、私は "PriceCollection"オブジェクトに隠されたフィールドとして渡すのではなく、インデックスの価格レベルのIDを使用してばかげていました。 –

関連する問題