簡體   English   中英

如何將Asp.NET詳細信息視圖綁定到具有列表的對象 <string> 屬性

[英]How to bind an Asp.NET details view to an object with a List<string> property

我有以下示例實體對象

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

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

現在,我有一個綁定到數據網格的詳細信息視圖,並且兩者都可以很好地顯示/編輯name屬性,但是我也希望能夠編輯fields屬性。

我希望使用多行文本框來執行此操作。 因此,每一行將對應於“字段”列表中的一個項目。 但是我在如何將列表綁定到文本框時遇到問題,因此每個項目都在新行上。 我不認為要刪除細節並將它們放回對象中以供以后保存,因為我是手動執行此操作。

所以問題是,有沒有辦法在詳細信息視圖的文本框中執行自定義綁定,以便每個IList項都位於單獨的行上?

正確的答案似乎如下:

在代碼中綁定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問題中提供此答案。

您所追求的是類似於嵌套的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。

嘗試類似

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

您還可以使用擴展方法,因此您不必在所有頁面上都顯式為此任務創建方法。

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


    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM