1

ASP.NETMVCを使用して非常に柔軟なHTMLフォームに取り組んでいます。フォームの後半で[その値]の入力要素のセットを動的に作成する「数量」入力要素があります。

たとえば、Quantityが1に設定されている場合、ユーザー名、部屋番号、建物名のテキストボックスが1セットあります。ただし、Quantityが10に設定されている場合、これらのテキストボックスはそれぞれ10個表示されます。

明らかに、データがサーバーにポストバックされるとき、私は各ユーザー名、部屋、建物を正しくグループ化する必要があり、それらが混乱しないようにする必要があります。

これを行う最も簡単な方法は、すべてのセットを同じにすることだと思われます。

<input type="text" name="username"/>
<input type="text" name="room"/>
<select name="building">                           <!--All this x Quantity-->
   <option value="TARDIS">TARDIS</option>
   <option value="USS Enterprise">USS Enterprise</option>
</select>

<input type="text" name="username"/> <!--And so on...-->

usernames[0]そして、POST文字列が要素がHTMLに書き込まれる順序を保持することを信頼します。これにより、rooms[0]すべてbuildings[0]の等しいインデックスの他のエントリ。

それは100%の時間で機能しますか?安全ですか?入力のグループ間でハードかつ高速な関連付けを行う方法をいくつか考えることができますが、それらには、やや刺激的なjavascriptと非常に不快なC#が含まれます。これは、箱から出してすぐに機能するようです。え?

4

2 に答える 2

2

フォームをマッピングできるモデルを作成する

public class PostedModel
{
 public List<DataGroup> PostedData { get; set; }
}

public class DataGroup
{
 public string username { get; set; }
 public string room { get; set; }
 public string? building { get; set; }//nullable because this is bound do a dropdownlist
}

フォームで、モデルに準拠します

<!-- Input Set 0 -->
<input type="text" name="PostedData[0].username"/>
<input type="text" name="PostedData[0].room"/>
<select name="PostedData[0].building">
 <option value="TARDIS">TARDIS</option>
 <option value="USS Enterprise">USS Enterprise</option>
</select>

<!-- Input Set 1 -->
<input type="text" name="PostedData[1].username"/>
<input type="text" name="PostedData[1].room"/>
<select name="PostedData[1].building">
 <option value="TARDIS">TARDIS</option>
 <option value="USS Enterprise">USS Enterprise</option>
</select>

<!-- Input Set 2 -->
<input type="text" name="PostedData[2].username"/>
<input type="text" name="PostedData[2].room"/>
<select name="PostedData[2].building">
 <option value="TARDIS">TARDIS</option>
 <option value="USS Enterprise">USS Enterprise</option>
</select>

以前に作成したモデルに投稿を自動的にバインドします

[HttpPost]
public ActionResult PostedAction ( PostedModel model )
{
 //use the data
 for( DataGroup curr in model.PostedData )
 {
   curr.username
   curr.room
   curr.building.Value //.Value because it was set to nullable with the ?
 }
 return RedirectToAction("BaseAction");//Post-Redirect-Get pattern
}
于 2012-10-31T21:29:04.513 に答える
1

Phil Haackは、入力フィールドをで強く型付けされたコレクションにバインドするために、入力フィールドに予想される名前を非常にうまく説明しましたthis blog post。したがって、あなたがしなければならないのは、この慣習を尊重することだけです。following blog postスティーブン・サンダーソンがこのシナリオを実際にどのように実装できるかを説明しているので、興味深いと思うかもしれません。彼の例では、アイテムの追加/削除ボタンを使用していますが、これは、追加するアイテムの数がテキストボックスに入力されるシナリオに非常に簡単に置き換えることができます。

于 2012-10-31T21:25:50.327 に答える