8

注意:这是 .NET 4.5 中的 ASP.NET Web 窗体模型绑定,而不是 MVC。

我正在使用 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>
  <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>
  <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 控件之外的任何东西)。

谁能进一步阐明这个问题(最好告诉我需要做什么)?

我看过的关于 SO 的其他问题......

所有这些都使用旧式绑定方法,而不是 4.5 中的新方法

谢谢。

4

1 回答 1

6

我一直在做类似的事情,并且能够得到一个样本来工作,所以我想我会发布我所拥有的,看看这是否对你有帮助。

这是我的页面代码:

<%@ 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 示例,所以我猜测您可能如何设置它。请让我知道这是否有帮助以及这是否/如何对您有用,因为您的代码看起来可行,我很好奇是什么导致了您的问题。

于 2013-02-24T18:24:15.867 回答