Добавить шаблон 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". Я знаю, что это нужно поместить в шаблон макета, но как я добавляю эти шаблоны с помощью кода, как мне заставить работать шаблон редактирования?
Заранее спасибо за ваше время и помощь!