3

モデルバインディングがドロップダウンで機能しないのはなぜですか?
私は何を間違っていますか?
私の問題を説明するために、次のことを行いました。

新しい asp.net MVC プロジェクト (beta1) を作成しました 次のクラスを作成しました:

HomeViewData : ViewDataDictionary  
+List : SelectList

次のように Viewdata を HomeController クラスに追加しました

Homecontroller: Controller
+HomeViewData vd = new HomeViewData

Home.Index() メソッドに次の行を追加しました

vd.list = new SelectList(new List<string>(){"test", "test1", "test2"});
return View("Index", vd);

同じメソッドをレプリケートしましたが、ポストバック呼び出しをキャッチするために異なる署名を使用しました

[AcceptVerps(HttpVerbs.Post)]
public ActionResult Index(HomeViewdata d)

ここでは、コードの最初の行にブレークポイントを追加しました。
次に、次のコードを Index.aspx に追加しました

<%Html.BeginForm();%>
    <%=Html.DropDownList("List")%>
<%Html.EndForm();%>

その結果、test、test1、および test2 という値の適切なドロップダウンがあるページが表示されます。
次に、値を選択した後、Enter キーを押し (送信ボタンは気にしませんでした)、ブレークポイントがコードをどのように停止するかを確認します。HomeViewData の値を確認します... NULL

同じ演習をテキストボックスなどで行うと、すべて正常に動作します...
--編集--
この投稿以降に試したこと:

  • [Bind(Prefix="")] フィルの提案に従ってアクションに属性を追加する
  • [Bind(Prefix=" ")] を追加して、「空の名前は許可されていません」というエラーが削除されるかどうかを確認します
  • コントロールの名前にアクションのパラメーターの名前を追加する
4

1 に答える 1

3

ここでの問題は、慣例により、モデル バインダーが "d.PropertyName" の形式で値を検索することです。これは、Index アクション メソッドへの引数が "d" であるためです。

アクション メソッドには複数の引数を指定できるため、デフォルトでは引数名をプレフィックスとして使用します。

これを修正するのは簡単です。Bind 属性を使用して、MVC にプレフィックスを使用しないように指示するだけです。

[AcceptVerps(HttpVerbs.Post)]
public ActionResult Index([Bind(Prefix="")]HomeViewdata d)
于 2008-11-21T17:15:45.580 に答える