Especificar un marcador de posición tema estableciendo la propiedad ID de un control a “itemPlaceholder”
-
19-09-2019 - |
Pregunta
Sólo tengo una sola página "Default.aspx" y un solo control ListView. ¿Por qué recibo este error. Nunca antes había sucedido
"Un marcador de posición artículo debe ser especificado en ListView 'ListView1'. Especificar un marcador de posición tema estableciendo la propiedad ID de un control a 'itemPlaceholder'. El control de elemento de marcador de posición debe especificar también runat =" server ""
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TesterConcepts._Default"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
onselecting="ObjectDataSource1_Selecting" SelectMethod="GetItemsCollection"
TypeName="TesterConcepts.CutomDataSource">
<SelectParameters>
<asp:Parameter Name="items" Type="Object" />
</SelectParameters>
</asp:ObjectDataSource>
<asp:ListView ID="ListView1" runat="server" DataSourceID="ObjectDataSource1"
onselectedindexchanged="ListView1_SelectedIndexChanged">
</asp:ListView>
</body>
</html>
Hacer esto no era útil, incluso
<asp:ListView ID="ListView1" runat="server" DataSourceID="ObjectDataSource1"
OnSelectedIndexChanged="ListView1_SelectedIndexChanged"
ItemPlaceholderID="PlaceHolder1">
</asp:ListView>
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
Ahora se lanza esta excepción
"Un marcador de posición artículo debe ser especificado en ListView 'ListView1'. Especificar un marcador de posición tema estableciendo la propiedad ID de un control a 'PLACEHOLDER1'. El control de elemento de marcador de posición también debe especificar runat =" server ""
Solución
Parece que es necesario definir la estructura del elemento marcador de posición para los elementos item que devolverá la consulta.
Me gustaría sugerir la lectura de este artículo. Un poco viejo, pero ilustra el concepto. http://www.4guysfromrolla.com/articles/122607-1.aspx
Otros consejos
En ListView, diseño de plantillas es la plantilla que decide el diseño de la pantalla de datos. Se debe tener una etiqueta de elemento marcador de posición con el atributo runat =”server”.
Desde LayoutTemplate del ListView y ItemTemplate se definen cada uno por separado, necesitamos alguna manera de contar la LayoutTemplate, "Hey, para cada registro que está visualizando, poner el marcado artículo traducido aquí". Esto se logra mediante la adición de un control del lado del servidor con el valor de ID especificado por la propiedad ItemPlaceholderID del ListView.
Ref - http://www.4guysfromrolla.com/articles/122607-1. aspx
Por lo tanto ua tener que 1) Definir una ItemsTemplate 2) Añadir un marcador de posición en el LayoutTemplate
<tr runat="server" id="itemPlaceholder">
</tr>
o
<ItemTemplate>
<tr>
<td>
<asp:Label ID="MessageLabel" runat="server" Text='<%# Eval("Item") %>' />
</td>
<td>
<asp:Label ID="URLLabel" runat="server" Text='<%# Eval("URL") %>' />
</td>
</tr>
</ItemTemplate>
Así que el diseño final se verá así
<asp:ListView ID="NoticeItemsListView" runat="server">
<LayoutTemplate>
<table width="200px">
<tr>
<th>
Message
</th>
<th>
URL
</th>
</tr>
<tr runat="server" id="itemPlaceholder">
</tr>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td>
<asp:Label ID="MessageLabel" runat="server" Text='<%# Eval("Item") %>' />
</td>
<td>
<asp:Label ID="URLLabel" runat="server" Text='<%# Eval("URL") %>' />
</td>
</tr>
</ItemTemplate>
</asp:ListView>
Dentro de su ListView súmale un LayoutTemplate que contiene el marcador de posición:
<asp:ListView ID="listview1" runat="server" ItemPlaceholderID="PlaceHolder1" >
<LayoutTemplate>
<asp:PlaceHolder ID="PlaceHolder1" runat="server" />
</LayoutTemplate>
<ItemTemplate>
...
</ItemTemplate>
</asp:ListView>