注意:这是.NET 4.5和ASP.NET MVC中的ASP.NET Web窗体模型绑定。ASP.NET Web窗体(4.5)强类型模型绑定 - ListView的InsertItemTemplate中的DropDownList
我正在使用ASP.NET Web窗体(4.5)的新强类型模型绑定功能来生成可以编辑的项目列表。这对于查看初始列表,编辑项目和删除项目工作正常。但是,我插入一个新项目时遇到问题。
具体来说,在我的EditItemTemplate和InsertItemTemplate中,我有一个DropDownList(嗯,实际上它是从DropDownList派生的一个自定义控件,但为了这个问题的目的,它是一个DropDownList)。控制是如下的标记内定义...
<agp:ClientStatusDropDownList ID="ClientStatusID" runat="server"
SelectedValue="<%#: BindItem.ClientStatusID %>" />
内EditItemTemplate中,这是然而,这在运行页面生成错误InsertTemplate则内细:数据绑定方法如eval()函数,XPath的( )和Bind()只能用于数据绑定控件的上下文中。
因此,我从InsertItemTemplate中删除了部分SelectedValue="<%#: BindItem.ClientStatusID %>"
,然后再次尝试。这次没有错误消息,但是当调用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();
}
}
Model类:
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>
InsertTemplate则:
<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>
我原本以为它是用来确定模型上该值将被传递给(即,其中TextBox被称为“描述”,该值将被传递给模型的“描述”属性)。显然情况并非如此,而是由“<%#BindItem.Description%>”来控制,但正如您从本问题的其余部分可以看到的,我无法在“InsertItemTemplate”中使用此语法。我无法相信在这种情况下不支持DropDownList,但我找不到任何与使用Google或Bing的4.5模型绑定一起使用的DropDownList的示例(事实上,ASP中的新模型绑定的例子非常少。 NET 4.5使用除了几个TextBox控件以外的任何东西)。
有没有人可以进一步阐明这个问题(并且最好告诉我需要做什么)?
关于我所看到的其他问题......
- Binding a DropDownList in ListView InsertItemTemplate throwing an error
- ASP.NET ListView with identical markup in EditItemTemplate and InsertItemTemplate
- Bind SelectedValue of ASP.net DropDownList to custom object
- Databinding to ASP.NET DropDownList list in ListView
所有这些使用旧样式的绑定方法,而不是新的方法在4.5
感谢。
仅供参考;我也尝试绑定到ClientStatusID不可为空的替代模型(这是代码隐藏,而不是标记)。没有区别,财产仍然没有设置。这(在我看来)排除了可能为空的任何潜在问题。 – 2013-02-18 12:14:06