Как связать подробное представление Asp.NET с объектом со свойством List <string> - PullRequest
0 голосов
/ 12 ноября 2009

У меня есть следующий пример объекта объекта

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

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

Теперь у меня есть подробное представление, привязанное к сетке данных, и оба могут нормально отображать / редактировать свойство name, но я также хочу иметь возможность редактировать свойство fields.

Я надеялся использовать многострочное текстовое поле для этого. Таким образом, каждая строка будет соответствовать элементу в списке полей. Но у меня возникла проблема, как связать список с текстовым полем, чтобы каждый элемент находился в новой строке. Я не думаю, что у меня есть проблема с извлечением деталей и их последующим помещением в объект для последующего сохранения, поскольку я делаю это вручную.

Итак, вопрос в том, есть ли способ выполнить пользовательское связывание для текстового поля в подробном представлении, чтобы каждый элемент IList находился на отдельной строке?

Ответы [ 4 ]

0 голосов
/ 12 ноября 2009

Вы также можете использовать методы расширения, чтобы вам не пришлось явно указывать методы для этой задачи на всех ваших страницах.

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


    }
0 голосов
/ 12 ноября 2009

То, что вы ищете, это что-то вроде вложенного 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.

0 голосов
/ 12 ноября 2009

попробуйте что-то вроде

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(string[] Fields)
{
// do something with Fields array
}
0 голосов
/ 12 ноября 2009

Правильно, ответ выглядит следующим образом:

В коде связать страницу 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>

Я хочу поблагодарить Дейва за ответ на вопрос Newbie ASP.NET Eval вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...