デフォルトのモデルバインディングハンドルリストを作成するにはどうすればよいですか?リストへのモデルバインディング
のは、私がShoppingCartItemリストを持っているのShoppingCartクラスを、持っているとしましょう:
@ModelType VAVTag.LuckyDraw.ShoppingCart
@Code
Layout = Nothing
End Code
<!DOCTYPE html>
<html>
<head runat="server">
<title>Index</title>
</head>
<body>
@Using Html.BeginForm()
@<fieldset>
<legend>ShoppingCart</legend>
@Html.TextBoxFor(Function(m) m.CouponCode)
<hr />
@Html.EditorFor(Function(m) m.Items)
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
End Using
</body>
</html>
:
Public Class ShoppingCart
Public Property CouponCode As String
Public Property Items As New List(Of ShoppingCartItem)
End Class
Public Class ShoppingCartItem
Public Property Title As String
Public Property Count As Integer
End Class
私の見解では、この(this、およびthisからのアドバイスどおり、ブログ投稿)のように見えます
アイテムはEditorTemplateを使用してレンダリングされます(Darinありがとう):
@ModelType ShoppingCartItem
@Html.EditorFor(Function(m) m.Title)
@Html.EditorFor(Function(m) m.Count)
<br />
私のコントローラでは、いくつかのランダムなデータを挿入しています。このビューは、3つのアイテムを使ってショッピングカートをきれいにレンダリングします。
Public Class ShoppingCartController
Inherits System.Web.Mvc.Controller
Function Index() As ActionResult
Dim model As New ShoppingCart
model.Items.Add(New ShoppingCartItem With {.Count = 1, .Title = "Item A"})
model.Items.Add(New ShoppingCartItem With {.Count = 17, .Title = "Item B"})
model.Items.Add(New ShoppingCartItem With {.Count = 100, .Title = "Item C"})
Return View(model)
End Function
<HttpPost()>
Function Index(model As ShoppingCart) As ActionResult
Return View(model) ' model is empty!
End Function
End Class
ただし、私がページを送信すると、値は取得されず、[クーポンコード]フィールドも表示されません。モデルオブジェクトは空です。何がありますか?
最終的に私の目標は、JavaScriptを使用してクライアントのアイテムを追加/削除してから、モデルバインダーにページの送信時に自動的に変更を反映させることです。
更新:モデルプロパティ宣言のProperty
キーワードが欠落していました。それは遅すぎる、と私はいくつかの睡眠を取得する必要があります。 :)
うん、それは私がリンクしているブログポストです。しかし、それは私のために働いていない、と私は理由を把握することはできません。 Scottsの例では、ビューモデル自体はコレクションですが、私のシナリオではリストはモデルのプロパティの1つです。 –
@ Jakob Gadeでは、ビューに醜いループを書き、入力フィールド名を手動で生成する代わりに、エディタテンプレートを使用する必要があります。私はあなたの例を説明するために私の答えを更新しました。これがどれくらい簡単か見てください。ループや醜い意見を書いたり、フィールド名を心配する必要はありません。すべてが慣例によってうまく機能します。申し訳ありませんが、私のVB.NETは非常に錆びていますが、翻訳するのは簡単なことです。 –
ありがとう、優秀な例、私はそれを試してみましょう。 –