0

次のようなモデルがあります

class ContainerClass
{
    string Name { get; set;}
    Guid Id { get; set; }

    [UIHint("CustomSelectBox")]
    List<Member> Members { get; set; }
}

class Member
{
    string Name { get; set;}
    Guid Id { get; set; }
    string SomeProperty { get; set;}
}

class DerivedFromMember: Member
{
   string AnotherProperty { get; set;}
}

コントローラーのアクションが

    [HttpPost]
    public ActionResult Edit(ContainerClassmodel)
    {
         return null;
    } 

デフォルトのモデルバインダーがタグからリストメンバーをマップできない理由を誰かが教えてもらえますか?

<select id="Members" name="Members" multiple="multiple" >
 <option id="Members[0].Id" selected="selected" name="Members[0].Id" value="9b1ea01c-6dad-470d-a6c1-a0f5009ac069">Member One</option>
<option id="Members[1].Id" selected="selected" name="Members[1].Id" value="adf1dbda-9020-45b7-abd7-a0f5009a9b30">Member two</option>
</select>

すべての値が選択されていることに注意してください。

一方、次の作品

 <input type="hidden" name="Members[0].Id" value="9b1ea01c-6dad-470d-a6c1-a0f5009ac069" />
 <input type="hidden" name="Members[1].Id" value="adf1dbda-9020-45b7-abd7-a0f5009a9b30" />

正直に言うと、それが機能しない理由はわかっています:(なぜなら、selectの場合にhttpヘッダーを見ると、送信されたデータがデフォルトのモデルバインダーには不十分だからです。

Members:9b1ea01c-6dad-470d-a6c1-a0f5009ac069
Members:adf1dbda-9020-45b7-abd7-a0f5009a9b30

送信されたデータが

Members[0].Id:9b1ea01c-6dad-470d-a6c1-a0f5009ac069
Members[1].Id:adf1dbda-9020-45b7-abd7-a0f5009a9b30
4

1 に答える 1

0

選択リストを使用する場合、モデルには 2 つのものが必要です。

  1. 選択リストに入力するコレクション。
  2. サーバーにポストバックするときに、選択したアイテムの値を保持するプロパティ。

強く型付けされたバージョンは次のようになります。

@Html.ListBoxFor(x=> x.Id, IEnumerable<SelectListItem>)

名前を手動で指定する場合は、次のようにします。

@Html.ListBox("Id", IEnumerable<SelectListItem>)

ユーザーは複数のオプションを選択できるためId、選択リストの値が含まれるタイプの配列である必要があります。それらが整数の場合は、次Idのようにする必要がありますpublic int[] Id {get; set;}

フォームを送信すると、コントロールは値のみを送信します。リスト ボックスは、元のMembersリストにバインドするのに十分なデータを送信しません。何らかの理由で追加情報が必要な場合は、返された ID を取得する必要があります。

最初のコメントに応じて編集します。

うまくいけば、私はあなたを正しく理解しています。

AJAX を介してその選択ボックスのその他のオプションを照会する場合は、JSON を返す別のアクションに AJAX エンドポイントを設定できます。実際に送り返す必要があるのは、キーと値のペアのコレクション (オプション値とテキスト) だけです。次に、JavaScript を使用して、元のリスト ボックスに選択肢を追加します。のシリアル化について質問してIEnumerable<SelectListItem>いる場合、それが適切にシリアル化されるかどうかはわかりません。

于 2012-10-29T15:46:50.397 に答える