如何将Asp.NET详细信息视图绑定到具有List <string>属性</string>的对象

时间:2009-11-12 09:49:33

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

我有以下示例实体对象

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

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

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

我希望使用多行文本框来执行此操作。因此,每一行都对应于“字段”列表中的项目。但是我遇到了如何将列表绑定到文本框的问题,因此每个项目都在新行上。我不认为我有一个问题是获取细节,然后将它们放回到对象中以便保存,因为我手动执行此操作。

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

4 个答案:

答案 0 :(得分:0)

答案似乎如下:

在代码绑定中,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问题中提供此答案。

答案 1 :(得分:0)

你所追求的是类似嵌套的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。

答案 2 :(得分:0)

尝试类似

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

答案 3 :(得分:0)

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

<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()); 
        }


    }