答えはとても良いですが、MVCと.NETの最新リリースには、「古い学校」のFormCollectionキーとRequestキーの代わりに、本当に使いたい別の方法があります。
AJAXまたはFORM POSTを実行するformタグ内に含まれるHTMLスニペットを考えてみます。
<input type="hidden" name="TrackingID"
<input type="text" name="FirstName" id="firstnametext" />
<input type="checkbox" name="IsLegal" value="Do you accept terms and conditions?" />
コントローラは実際にフォームデータを解析し、定義されたタイプのパラメータとしてそれを配信しようとします。トリッキーなのでチェックボックスを入れました。チェックされている場合はテキスト「on」を返し、チェックされていない場合はnullを返します。ただし、これらの定義された変数が存在しなければならない(nullableでない限り(nullableであることを覚えておいてくださいstring
))必要があります。そうでない場合、AJAXまたはPOSTバックは失敗します。
[HttpPost]
public ActionResult PostBack(int TrackingID, string FirstName, string IsLegal){
MyData.SaveRequest(TrackingID,FirstName, IsLegal == null ? false : true);
}
かみそりヘルパーを使用せずにモデルをポストバックすることもできます。これが何度か必要になることを知りました。
public Class HomeModel
{
public int HouseNumber { get; set; }
public string StreetAddress { get; set; }
}
HTMLマークアップは単に...
<input type="text" name="variableName.HouseNumber" id="whateverid" >
そして、コントローラー(Razor Engine)は、フォーム変数「variableName」(名前は好きなようですが、一貫性を保ちます)をインターセプトし、それを構築してMyModelにキャストしようとします。
[HttpPost]
public ActionResult PostBack(HomeModel variableName){
postBack.HouseNumber; //The value user entered
postBack.StreetAddress; //the default value of NULL.
}
コントローラーがモデル(この場合はHomeModel)を期待している場合、パーサーはフィールドをデフォルト(通常はNULL)のままにするため、すべてのフィールドを定義する必要はありません。良い点は、マークアップでさまざまなモデルを混合して一致させることができ、ポストバック解析が可能な限り読み込まれることです。ページでモデルを定義したり、ヘルパーを使用したりする必要はありません。
ヒント:コントローラーのパラメーターの名前は、HTMLマークアップ「name = "で定義された名前であり、モデルの名前ではなく、!
List<>
マークアップの使い方は少し複雑です。
<input type="text" name="variableNameHere[0].HouseNumber" id="id" value="0">
<input type="text" name="variableNameHere[1].HouseNumber" id="whateverid-x" value="1">
<input type="text" name="variableNameHere[2].HouseNumber" value="2">
<input type="text" name="variableNameHere[3].HouseNumber" id="whateverid22" value="3">
List <>のインデックスは常にゼロベースでシーケンシャルでなければなりません。0、1、2、3。
[HttpPost]
public ActionResult PostBack(List<HomeModel> variableNameHere){
int counter = MyHomes.Count()
foreach(var home in MyHomes)
{ ... }
}
IEnumerable<>
非ゼロベースの非連続インデックスにポストバックを使用します。バインダーを支援するために、隠し入力を追加する必要があります。
<input type="hidden" name="variableNameHere.Index" value="278">
<input type="text" name="variableNameHere[278].HouseNumber" id="id" value="3">
<input type="hidden" name="variableNameHere.Index" value="99976">
<input type="text" name="variableNameHere[99976].HouseNumber" id="id3" value="4">
<input type="hidden" name="variableNameHere.Index" value="777">
<input type="text" name="variableNameHere[777].HouseNumber" id="id23" value="5">
そして、コードはIEnumerableを使用して呼び出すだけです ToList()
[HttpPost]
public ActionResult PostBack(IEnumerable<MyModel> variableNameHere){
int counter = variableNameHere.ToList().Count()
foreach(var home in variableNameHere)
{ ... }
}
ページごとに単一のモデルまたはViewModel(複雑な「ビュー」モデルを作成するために他のモデルを含むモデル)を使用することをお勧めします。提案どおりの混合とマッチングは悪い習慣と見なすことができますが、それが機能し、読み取り可能である限り、それは悪いことではありません。ただし、Razorエンジンのパワーと柔軟性を示しています。
したがって、何かをドロップするか、Razorヘルパーから別の値をオーバーライドする必要がある場合、または独自のヘルパーを作成したくない場合は、データの異常な組み合わせを使用する単一のフォームで、これらのメソッドをすばやく使用して追加を受け入れることができますデータ。