我正在使用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();
- }
- }
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>
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被称为“描述”的位置,该值将被传递给“描述”该模型的财产).显然情况并非如此,而是由“<%#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
谢谢.
解决方法
- <%@ Page Language="C#" AutoEventWireup="true" CodeFile="listview-databind.aspx.cs"
- Inherits="test_listview_databind" Debug="true" %>
- <!DOCTYPE html>
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head runat="server">
- <title></title>
- </head>
- <body>
- <form id="form1" runat="server">
- <asp:ListView ID="lv" runat="server" ItemType="DataModel" DataKeyNames="Id" SelectMethod="lv_GetData"
- InsertItemPosition="FirstItem" InsertMethod="lv_InsertItem" UpdateMethod="lv_UpdateItem">
- <LayoutTemplate>
- <table>
- <tr id="itemPlaceholder" runat="server"></tr>
- </table>
- </LayoutTemplate>
- <ItemTemplate>
- <tr>
- <td>
- <asp:Literal ID="Description" runat="server" Text="<%# Item.Description %>" />
- </td>
- <td>
- <asp:CheckBox ID="IsScheduleFollowUp" runat="server" Checked="<%# Item.IsScheduleFollowUp %>" />
- </td>
- <td>
- <asp:Literal ID="ClientStatusId" runat="server" />
- </td>
- <td>
- <asp:Button ID="Edit" runat="server" ClientIDMode="Static" CommandName="Edit"
- Text="Edit" />
- </td>
- </tr>
- </ItemTemplate>
- <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>
- <asp:DropDownList ID="ClientStatusId" runat="server" SelectedValue="<%# BindItem.ClientStatusId %>">
- <asp:ListItem>1</asp:ListItem>
- <asp:ListItem>2</asp:ListItem>
- </asp:DropDownList>
- </td>
- <td>
- <asp:Button ID="Insert" runat="server" ClientIDMode="Static" CommandName="Insert"
- Text="Add" />
- <asp:Button ID="Cancel" runat="server" ClientIDMode="Static" CommandName="Cancel"
- Text="Cancel" />
- </td>
- </tr>
- </InsertItemTemplate>
- <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>
- <asp:DropDownList ID="ClientStatusId" runat="server" SelectedValue="<%# BindItem.ClientStatusId %>">
- <asp:ListItem>1</asp:ListItem>
- <asp:ListItem>2</asp:ListItem>
- </asp:DropDownList>
- </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>
- </asp:ListView>
- </form>
- </body>
- </html>
而我的代码背后:
- using System.Collections.Generic;
- using System.Linq;
- public partial class test_listview_databind : System.Web.UI.Page
- {
- public IQueryable<DataModel> lv_GetData()
- {
- var l = new List<DataModel>();
- l.Add(new DataModel() { Id = 1,Description = "Test 1",IsScheduleFollowUp = true,ClientStatusId = 1 });
- l.Add(new DataModel() { Id = 2,Description = "Test 2",IsScheduleFollowUp = false,ClientStatusId = 2 });
- return l.AsQueryable();
- }
- public void lv_InsertItem()
- {
- var item = new DataModel();
- TryUpdateModel(item);
- if (ModelState.IsValid)
- {
- Response.Write(item.ClientStatusId);
- }
- }
- }
你没有发布你的整个ListView示例,所以我猜测你如何设置它.请告诉我这是否有用以及是否/如何对您有用,因为您的代码看起来可行并且我很好奇导致您的问题的原因.