注:これは、MVCではなく.NET4.5でのASP.NETWebフォームモデルバインディングです。
ASP.NET Webフォーム(4.5)の新しい厳密に型指定されたモデルバインディング機能を使用して、編集可能なアイテムのリストを作成しています。これは、初期リストの表示、アイテムの編集、およびアイテムの削除に問題なく機能します。しかし、新しいアイテムの挿入に問題があります。
具体的には、EditItemTemplateとInsertItemTemplate内にDropDownListがあります(実際には、DropDownListから派生したカスタムコントロールですが、この質問の目的ではDropDownListです)。コントロールは、マークアップ内で次のように定義されています。
<agp:ClientStatusDropDownList ID="ClientStatusID" runat="server"
SelectedValue="<%#: BindItem.ClientStatusID %>" />
EditItemTemplate内ではこれで問題ありませんが、InsertItemTemplate内では、ページの実行時にエラーが発生します。Eval ()、XPath()、Bind()などのデータバインディングメソッドは、データバインドされたコントロールのコンテキストでのみ使用できます。
そのためSelectedValue="<%#: BindItem.ClientStatusID %>"
、InsertItemTemplateからセクションを削除して、再試行しました。今回はエラーメッセージは表示されませんが、ListView.InsertMethod
が呼び出されると、モデルのClientStatusIDプロパティがDropDownListの値に設定されません(残りのプロパティは正しく設定されます)。
ListView.InsertMethod:
public void ListView_InsertMethod(int ID) {
Model model = this.DbContext.Models.Create();
if (this.TryUpdateModel(model)) {
this.DbContext.SaveChanges();
this.ListView.DataBind();
}
}
モデルクラス:
public class Model{
public Int32 ID { get; set; }
public String Description { get; set; }
public Boolean IsScheduleFollowUp { get; set; }
public Nullable<Int32> ClientStatusID { get; set; }
}
EditItemTemplate:
<EditItemTemplate>
<tr>
<td>
<asp:TextBox ID="Description" runat="server" Text="<%#: BindItem.Description %>" />
</td>
<td>
<asp:CheckBox ID="IsScheduleFollowUp" runat="server" Checked="<%# BindItem.IsScheduleFollowUp %>" />
</td>
<td>
<agp:ClientStatusDropDownList ID="ClientStatusID" runat="server" SelectedValue="<%#: BindItem.ClientStatusID %>" />
</td>
<td>
<asp:Button ID="Update" runat="server" ClientIDMode="Static" CommandName="Update" Text="Update" />
<asp:Button ID="Cancel" runat="server" ClientIDMode="Static" CommandName="Cancel" Text="Cancel" />
</td>
</tr>
</EditItemTemplate>
InsertItemTemplate:
<InsertItemTemplate>
<tr>
<td>
<asp:TextBox ID="Description" runat="server" Text="<%#: BindItem.Description %>" />
</td>
<td>
<asp:CheckBox ID="IsScheduleFollowUp" runat="server" Checked="<%# BindItem.IsScheduleFollowUp %>" />
</td>
<td>
<agp:ClientStatusDropDownList ID="ClientStatusID" runat="server" />
</td>
<td>
<asp:Button ID="Insert" runat="server" ClientIDMode="Static" CommandName="Insert" Text="Add" />
</td>
</tr>
</InsertItemTemplate>
私は当初、値が渡されるモデルのプロパティを決定するために使用されるのはコントロールのIDだと思っていました(つまり、TextBoxが「Description」と呼ばれる場合、値は「Description」に渡されます)モデルのプロパティ)。明らかにこれは当てはまらず、代わりに「<%#BindItem.Description%>」によって制御されますが、この質問の残りの部分からわかるように、「InsertItemTemplate」でこの構文を使用することはできません。このシナリオでDropDownListがサポートされていないことは信じられませんが、GoogleまたはBingを使用した4.5モデルバインディングで使用されているDropDownListの例は見つかりません(実際、ASPでの新しいモデルバインディングの例はほとんどありません。いくつかのTextBoxコントロール以外のものを使用するNET4.5)。
誰かがこの問題にさらに光を当てることができますか(そしてできれば何をする必要があるか教えてください)?
私が見たSOに関する他の質問...
- エラーをスローするListViewInsertItemTemplateでDropDownListをバインドする
- EditItemTemplateとInsertItemTemplateで同じマークアップを持つASP.NETListView
- ASP.netDropDownListのSelectedValueをカスタムオブジェクトにバインドします
- ListViewのASP.NETDropDownListリストへのデータバインディング
これらはすべて、4.5の新しいメソッドではなく、古いスタイルのバインディングメソッドを使用します
ありがとう。