Добавить шаблон EditItem в ListView с динамическими привязками с шаблонами Layout и Item, созданными программно - asp.net

Я тяну поля и контактную информацию из веб-службы. Я создаю шаблоны Layout и Item в коде. Вот код.ascx и.ascx.cs:

.ascx

<LayoutTemplate>
    <%-- generated dynamically --%>
</LayoutTemplate>

<ItemTemplate>
    <%-- generated dynamically --%>
</ItemTemplate>

.ascx.cs

protected void Page_Load(object sender, EventArgs e)
{
    List<Field> fields = new List<Field>();
    List<Contact> contacts = new List<Contact>();


    using (var client = new HttpClient())
    {

        client.BaseAddress = new Uri("http://localhost:5592/");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        string fieldPath = "/api/Fields";

        HttpResponseMessage response = client.GetAsync(fieldPath).Result;
        if (response.IsSuccessStatusCode)
        {
            string responseString = response.Content.ReadAsStringAsync().Result;
            fields = JsonConvert.DeserializeObject<List<Field>>(responseString);
        }

        string contactPath = "/api/Contacts";

        response = client.GetAsync(contactPath).Result;
        if (response.IsSuccessStatusCode)
        {
            string responseString = response.Content.ReadAsStringAsync().Result;
            contacts = JsonConvert.DeserializeObject<List<Contact>>(responseString);
        }
    }

    LayoutTemplate layoutTemplate = new LayoutTemplate();
    ItemTemplate itemTemplate = new ItemTemplate();
    EditItemTemplate editItemTemplate = new Contacts.EditItemTemplate();

    layoutTemplate.AllFields = fields;
    itemTemplate.AllFields = fields;
    editItemTemplate.AllFields = fields;


    lvContacts.LayoutTemplate = layoutTemplate;
    lvContacts.ItemTemplate = itemTemplate;
    lvContacts.EditItemTemplate = editItemTemplate;

    lvContacts.DataSource = contacts;
    lvContacts.DataBind();

}

Классы шаблонов Layout, Item и EditItem:

LayoutTemplate

public class LayoutTemplate : ITemplate
{
    public List<Field> AllFields { get; set; }

    public LayoutTemplate()
    {
        AllFields = new List<Field>();
    }

    public void InstantiateIn(Control container)
    {
        PlaceHolder ph = new PlaceHolder();

        ph.Controls.Add(new LiteralControl("<table>"));
        ph.Controls.Add(new LiteralControl("<tr>"));
        foreach (var field in AllFields)
        {
            ph.Controls.Add(new LiteralControl("<td width='" + field.PxWidth + "'>" + field.Name + "</td>"));
        }

        ph.Controls.Add(new LiteralControl("<td></td>"));

        ph.Controls.Add(new LiteralControl("</tr>"));
        ph.Controls.Add(new LiteralControl("<tr></tr>") { ID = "ItemPlaceholder" });
        ph.Controls.Add(new LiteralControl("</table>"));

        container.Controls.Add(ph);
    }
}

ItemTemplate

public class ItemTemplate : ITemplate
{
    public List<Field> AllFields { get; set; }

    public ItemTemplate()
    {
        AllFields = new List<Field>();
    }

    public void InstantiateIn(Control container)
    {

        ListViewItem item = (ListViewItem)container;

        var contactFields = (DataBinder.Eval(item.DataItem, "ContactFields") as List<ContactField>);

        string itemMarkup = "";


        itemMarkup += "<tr>";

        foreach (var field in AllFields)
        {
            var value = contactFields.Where(f => f.FieldID == field.Id).FirstOrDefault();

            if (value != null)
            {
                itemMarkup += "<td>"
                                + value.Value
                                + "</td>";
            }
            else
            {
                itemMarkup += "<td></td>";
            }
        }

        itemMarkup += "</tr>";

        LiteralControl litCtrl = new LiteralControl(itemMarkup);

        item.Controls.Add(litCtrl);
    }
}

а также

EditItemTemplate

public class EditItemTemplate : ITemplate
{
    public List<Field> AllFields { get; set; }

    public EditItemTemplate()
    {
        AllFields = new List<Field>();
    }

    public void InstantiateIn(Control container)
    {
        PlaceHolder ph = new PlaceHolder();

        ph.Controls.Add(new LiteralControl("<table>"));
        ph.Controls.Add(new LiteralControl("<tr>"));
        foreach (var field in AllFields)
        {
            ph.Controls.Add(new LiteralControl("<td width='" + field.PxWidth + "'>" + field.Name + "</td>"));
        }

        ph.Controls.Add(new LiteralControl("</tr>"));            
        ph.Controls.Add(new LiteralControl("</table>"));

        container.Controls.Add(ph);
    }
}

У меня проблемы с получением кнопок Edit/Delete (удалено из этого кода). Когда я нажимаю любой из них, я получаю сообщение о том, что мне нужно включить заполнитель с идентификатором ItemPlaceholder и установить runat="server". Я знаю, что это нужно поместить в шаблон макета, но как я добавляю эти шаблоны с помощью кода, как мне заставить работать шаблон редактирования?

Заранее спасибо за ваше время и помощь!

0 ответов

Другие вопросы по тегам