【问题标题】:How to bind an Asp.NET details view to an object with a List<string> property如何将 Asp.NET 详细信息视图绑定到具有 List<string> 属性的对象
【发布时间】:2009-11-12 09:49:32
【问题描述】:

我有以下示例实体对象

class Entity
{
   public string Name { get; set; }

   public IList<string> Fields { get; set; }
}

现在我有一个绑定到数据网格的详细信息视图,两者都可以很好地显示/编辑名称属性,但我也希望能够编辑字段属性。

我希望使用多行文本框来执行此操作。因此,每一行都对应于 Fields 列表中的一个项目。但是我遇到了如何将列表绑定到文本框的问题,以便每个项目都在一个新行上。我认为我没有问题将详细信息取出并将它们放回对象中以稍后保存,因为我手动执行此操作。

所以问题是,有没有一种方法可以在详细信息视图中对文本框执行自定义绑定,以便每个 IList 项目位于单独的行上?

【问题讨论】:

标签: c# asp.net data-binding detailsview


【解决方案1】:

对的答案好像是这样的:

在代码中绑定aspx页面创建方法如下:

public string CustomBind(object data)
{
   if(data is List<string>)
   {
      List<string> list = data as List<string>;

      return string.Join("\n", list.ToArray();
   }
}

然后在您的 aspx 页面中,您将在文本框上执行以下操作来绑定它。

<asp:Textbox TextMode="MultiLine" Text='CustomBind(Eval("MyList"))'></asp:TextBox>

我要感谢DaveNewbie ASP.NET Eval question 问题中提供这个答案。

【讨论】:

    【解决方案2】:

    您所追求的类似于嵌套的 ListView。嵌套这些东西会很麻烦,但这应该可以:

    <asp:GridView runat="server" ID="EntityGridView" AutoGenerateColumns="False" 
            EditIndex="0" OnRowUpdating="EntityGridView_RowUpdating">
            <Columns>
                <asp:TemplateField HeaderText="Name">
                    <ItemTemplate>
                        <asp:Label ID="NameLabel" runat="server" Text='<%# Bind("Name") %>'></asp:Label>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="NameTextBox" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
                    </EditItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:GridView runat="server" DataSource='<%# Eval("Fields") %>'/>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:ListView runat="server" DataSource='<%# Eval("Fields") %>' ID="FieldListView">
                            <LayoutTemplate>
                                <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
                            </LayoutTemplate>
                            <ItemTemplate>
                                <asp:TextBox Text='<%# Container.DataItem %>' runat="server" ID="FieldValue"/><br />
                            </ItemTemplate>
                        </asp:ListView>
                    </EditItemTemplate>
                </asp:TemplateField>
                <asp:CommandField  ShowEditButton="True" />
            </Columns>
        </asp:GridView>
    

    您的更新方法将如下所示:

    protected void EntityGridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        var updatedEntity = new Entity {Fields = new List<string>()};
    
        var row = EntityGridView.Rows[e.RowIndex];
    
        var nameTextBox = (TextBox) row.FindControl("NameTextBox");
        updatedEntity.Name = nameTextBox.Text;
    
        var fieldListView = (ListView) row.FindControl("FieldListView");
        foreach (var dataItem in fieldListView.Items)
        {
            var fieldValueTextBox = (TextBox)dataItem.FindControl("FieldValue");
            updatedEntity.Fields.Add(fieldValueTextBox.Text);
        }
    
        // Do your save etc here
    }
    

    然后您只需将实体列表绑定到 GridView。

    【讨论】:

      【解决方案3】:

      试试类似的东西

      [AcceptVerbs(HttpVerbs.Post)]
      public ActionResult Edit(string[] Fields)
      {
      // do something with Fields array
      }
      

      【讨论】:

        【解决方案4】:

        您还可以使用扩展方法,这样您就不必在所有页面上明确地为此任务创建方法。

        <asp:TextBox TextMode="MultiLine" ID="txtQuotes" runat="server" Text='<%# ((List<String>) Eval("Quotes")).ToMultiLine() %>' />
        
         public static class ExtensionMethods
            {      
        
                public static string ToMultiLine(this List<String> list)
                {
                    return String.Join("\n", list.ToArray()); 
                }
        
        
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-09
          • 2023-04-07
          • 1970-01-01
          • 2021-10-18
          • 2012-06-07
          • 1970-01-01
          • 2011-06-26
          • 1970-01-01
          相关资源
          最近更新 更多