説明
銀行口座情報を入力するためのフォームを含む支払いページがあります。銀行口座情報をモデル/エディター テンプレートにカプセル化しました。ページ自体には独自のビュー モデルがあり、エディタに渡される BankAccount プロパティがたまたま含まれています。
[[モデルを見る]]
public class PaymentPageModel {
public SomeProperty1 { get; set; }
public SomeProperty2 { get; set; }
public BankAccount BankAccount { get; set; }
...
}
public class BankAccount {
public int BankAccountTypeID { get; set; }
public string BankName { get; set; }
public string ABACode { get; set; }
public string AccountNumber { get; set;}
public IEnumerable<SelectListItem> BankAccountTypes {
get { ... // Constructs the list }
}
}
[[支払いページの HTML]]
<% using (Html.BeginForm()) { %>
<%: Html.EditorFor(m => m.BankAccount) %>
... // Other miscellaneous stuff not related to the actual BankAccount
<% } %>
[[エディタテンプレート]
...
<%: Html.DropDownListFor(m => m.BankAccountTypeID, Model.BankAccountTypes) %>
...
問題
最初は、Payment ページを BankAccount モデルに直接強く入力していたときに、これは完全に機能しました。ドロップダウン リストが適切に入力され、モデルから正しい値が選択されていました。
最近ページを変更し、BankAccount モデルをプロパティとして含む PaymentPageModel に強く型付けしました。HTML は変更されていません。その結果、DropDownList を除いて、エディタ テンプレートのすべての HTML 値が適切に入力されています。BankAccountTypes 選択リストから値のリストを適切にバインドしていますが、選択した値はバインドされていません。DropDownListのすぐ隣に出力することにより、ISにバインドされるはずの値が正しく設定されていることを確認しました。
これは私を狂わせ、モデル バインディングと HTML ヘルパー全般の信頼性に疑問を投げかけています。特に、複雑なビュー モデルをエディター テンプレートと組み合わせてプレゼンテーションや機能をカプセル化できない場合はなおさらです。
どんな提案でも大歓迎です。