asp.net - route - tag helpers asp net core
Texto predeterminado para el control de repetidor vacĂo (9)
Aún mejor: esta subclase agrega una propiedad EmptyDataTemplate. En su marca, ponga un elemento tal como lo haría con un elemento. Por defecto, esto ocultará el encabezado y el pie de página si no hay datos; puede cambiar esto con las propiedades HeaderVisibleWhenEmpty y FooterVisibleWhenEmpty en el marcado.
public class RepeaterWithEmptyDataTemplate : Repeater
{
public virtual ITemplate EmptyDataTemplate { get; set; }
protected virtual bool DefaultHeaderVisibleWhenEmpty
{
get { return false; }
}
protected virtual bool DefaultFooterVisibleWhenEmpty
{
get { return false; }
}
public bool HeaderVisibleWhenEmpty
{
get { return ViewState["hve"] == null ? DefaultHeaderVisibleWhenEmpty : (bool) ViewState["hve"]; }
set { ViewState["hve"] = value; }
}
public bool FooterVisibleWhenEmpty
{
get { return ViewState["fve"] == null ? DefaultFooterVisibleWhenEmpty : (bool) ViewState["fve"]; }
set { ViewState["fve"] = value; }
}
protected override void OnDataBinding(EventArgs e)
{
base.OnDataBinding(e);
if (Items.Count == 0 && EmptyDataTemplate != null)
{
var emptyPlaceHolder = new PlaceHolder {ID = "empty", Visible = true};
EmptyDataTemplate.InstantiateIn(emptyPlaceHolder);
//figure out where to put placeholder
RepeaterItem footer =
Controls.OfType<RepeaterItem>().FirstOrDefault(i => i.ItemType == ListItemType.Footer);
if (footer == null)
{
//add to end if no footer
Controls.Add(emptyPlaceHolder);
}
else
{
Controls.AddAt(Controls.IndexOf(footer), emptyPlaceHolder);
}
//hide header and footer according to properties.
foreach (RepeaterItem x in Controls.OfType<RepeaterItem>())
{
switch (x.ItemType)
{
case ListItemType.Header:
x.Visible = HeaderVisibleWhenEmpty;
break;
case ListItemType.Footer:
x.Visible = FooterVisibleWhenEmpty;
break;
}
}
}
}
}
Muestra en marcado:
<myprefix:RepeaterWithEmptyDataTemplate runat=server>
<ItemTemplate>blah blah blah</ItemTemplate>
<EmptyDataTemplate>Hey, no data!</EmptyDataTemplate>
</myprefix:RepeaterWithEmptyDataTemplate>
Tenga en cuenta que se debe llamar al método DataBind o no se mostrará la plantilla vacía.
Usando VS 2008, tengo un control de repetidor:
<asp:Repeater runat="server" ID="storesRep" DataSourceID="storeSqlDataSource"
OnItemDataBound="StoresRep_ItemDataBound">
<ItemTemplate>
<table style="padding:0px">
<tr>
<td style="width:200px"><asp:Label ID="infoLbl" runat="server">
Choose stores for upload:</asp:Label>
</td>
<td style="width:110px">
<asp:Label ID="storeLbl" runat="server" Text=''<%# Bind("Name") %>''>
</asp:Label>
</td>
<td><asp:CheckBox runat="server" ID="storeCheck" /></td>
</tr>
</table>
</ItemTemplate>
</asp:Repeater>
<asp:SqlDataSource ID="storeSqlDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:someConnectionString %>"
SelectCommand="SELECT [StoreId], [Name] FROM [Store] Order By [Name]">
</asp:SqlDataSource>
Ahora me gustaría mostrar un texto predeterminado como "No se encontraron tiendas" si el origen de datos no devuelve elementos de la base de datos. Hasta ahora, en su mayoría he usado GridView
donde no tuve problemas debido al atributo EmptyDataText
.
La mejor manera que encontré para resolver esto:
Agregue la siguiente etiqueta en cualquier lugar de su página:
<asp:Label ID="lblEmptyRepeater" runat="server" Visible="false" Text="There are no items in this repeater"></asp:Label>
Agregue el OnPreRenderEvent para su repetidor
<asp:Repeater ID="emptyRepeater" runat="server" OnPreRender="emptyRepeater_PreRender">
Ahora, dentro de este evento en tu código, escribe el código
protected void emptyRepeater_PreRender(object sender, EventArgs e) { lblEmptyRepeater.Visible = (emptyRepeater.Items.Count==0); }
Ahora debe revisar su repetidor vacío después de que los datos estén vinculados pero antes de renderizar en la página, y mostrar la etiqueta si está vacía.
La respuesta de Joaos puede incluso ser simplificada. En el pie de página, no establezca la propiedad visible de su elemento predeterminado en falso, pero use la siguiente expresión:
<FooterTemplate>
<asp:Label ID="defaultItem" runat="server"
Visible=''<%# YourRepeater.Items.Count == 0 %>'' Text="No items found" />
</FooterTemplate>
De esta manera, puede guardar el código detrás.
Otra posibilidad:
<FooterTemplate>
<asp:Label ID="lblEmptyData" runat="server" Visible=''<%# ((Repeater)Container.NamingContainer).Items.Count == 0 %>'' Text="No items found" />
</FooterTemplate>
El beneficio de este fragmento de código es que no depende de la ID que asignó a su repetidor.
Podría solucionar el hecho de que Repeater
no admite una forma integrada de lograr lo que está haciendo utilizando FooterTemplate
junto con el evento OnItemDataBound
y mostrando el pie de página solo cuando la fuente de datos no devuelve ningún elemento.
Puede encontrar ejemplos de cómo puede hacer esto en:
Manejo de datos vacíos en un control de repetidor ASP.NET
¿Cómo mostrar la plantilla vacía en el control de repetidor de ASP.NET?
Puede utilizar una plantilla de pie de página para gestionar el masaje, como este
Paso 1
<FooterTemplate>
<%-- Label used for showing Error Message --%>
<asp:Label ID="lblDefaultMessage" runat="server" Text="Sorry, no item is there to show." Visible="false">
</asp:Label>
</FooterTemplate>
Paso 2
Manejar la visibilidad de la etiqueta en el evento Repeater_ItemDataBound como
protected void Repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (Repeater.Items.Count < 1)
{
if (e.Item.ItemType == ListItemType.Footer)
{
Label lblDefaultMessage= (Label)e.Item.FindControl("lblDefaultMessage");
lblDefaultMessage.Visible = true;
}
}
}
Si no quieres ensuciar tu HTML con elementos ocultos (realmente no me gusta esconder cosas con JS):
Probablemente ya tenga una clase estática de Utils que tiene propiedades estáticas en ella. (Si no es así, haga clic en la solución y agregue -> clase)
Establecer una cadena estática pública oculta = ""; // en la nueva clase de Utils creada
En su código detrás del archivo .cs haga esto:
DataTable coll = ....
if(coll.Rows.Count < 1)
Utils.hidden = "<span>Sorry, there were no items</span>
Luego, en su archivo .ascx, la <FooterTemplate>
ve así:
<FooterTemplate>
<%# Utils.hidden %>
</FooterTemplate>
Sobre la base de la respuesta n. 3 Adopté la siguiente solución que me parece lo suficientemente buena:
<asp:Literal ID="emptyDataRowCnt" runat="server" Visible=''<%# MyRepeater.Items.Count == 0 %>''> <li class="row emptyDataRow">No data here</li> </asp:Literal>
Usando las propiedades visibles y los literales de asp proporcionados en las respuestas anteriores, extendí la respuesta de erionpc para mostrar un ''no datos'' o un conteo de registros.
<FooterTemplate>
<asp:Literal ID="repeaterEmptyDataRow" runat="server" Visible=''<%# Results_Repeater.Items.Count == 0 %>''>
<tr>
<td>No Data Found</td>
</tr>
</asp:Literal>
<asp:Literal ID="repeaterResultsDataRow1" runat="server" Visible=''<%# Results_Repeater.Items.Count != 0 %>''>
<tr>
<td>
</asp:Literal>
<asp:Literal ID="repeaterResultsDataRow2" runat="server" Visible=''<%# Results_Repeater.Items.Count != 0 %>'' Text=''<%# String.Concat(Results_Repeater.Items.Count.ToString(), " records.") %>'' />
<asp:Literal ID="repeaterResultsDataRow3" runat="server" Visible=''<%# Results_Repeater.Items.Count != 0 %>''>
</td>
</tr>
</asp:Literal>
</table>
</FooterTemplate>
No escribo mucho asp, así que quizás haya una forma más limpia de hacer esto.