2008-12-15 22 views
8

Tengo un código que imprime valores de databse en un control de repetidor en una página asp.net. Sin embargo, algunos de los valores devueltos son nulos/en blanco, y esto hace que el resultado se vea feo cuando hay espacios en blanco.Lógica condicional en la página ASP.net

¿Cómo se hace la lógica condicional en los controles de asp.net, es decir, imprimir un valor si existe, sino simplemente ir al siguiente valor.

Debo añadir también que quiero que el marcado sea condicional también, como si no hubiera ningún valor, tampoco quiero una etiqueta
.

Aquí hay un fragmento de código a continuación solo para mostrar el tipo de valores que obtengo de mi base de datos. (Es común que Dirección 2 no tenga ningún valor).

<div id="results"> 
    <asp:Repeater ID="repeaterResults" runat="server"> 
     <ItemTemplate> 
      Company:  <strong><%#Eval("CompanyName") %></strong><br /> 
      Contact Name: <strong><%#Eval("ContactName") %></strong><br /> 
      Address:  <strong><%#Eval("Address1")%></strong><br />      
          <strong><%#Eval("Address2")%></strong><br />.................. 

Muchas gracias

Respuesta

6

Va a ser una muy subjetiva esto, ya que depende por completo de dónde y cómo le gusta manejar valores nulos/espacio en blanco, y, de hecho, que uno de los dos que se trata de .

Por ejemplo, a algunos les gusta manejar nulos a nivel de base de datos, algunos prefieren codificar valores predeterminados en la capa de lógica de negocios y otros prefieren manejar valores predeterminados/en blanco en la interfaz de usuario, sin mencionar la gran cantidad de opciones intermedias .

De cualquier forma, mi elección personal sería asegurarse de mostrar que no había datos disponibles para ese campo en el nivel de UI para evitar confusiones. En el peor, algo a lo largo de las líneas de:

<strong><% If (Eval("Address2").Length > 0) Then %><%#Eval("Address2")%><% Else %>No data available for Address 2<% End If %></strong><br /> 

De esta manera, al menos, el usuario sabe que no hay datos disponibles, en lugar de no saber si ha habido algún error del sistema/administrativa.

Espero que ayude :)

1

Usted puede utilizar IsDBNull (obj)

If IsDbNull(<%#Eval("Address2")%>) then 
    etc 
End If 
+0

Este es C#: aunque IsDBNull() está disponible a través del espacio de nombres Microsoft.VisualBasic –

+0

a fin de utilizar == DBNull.Value –

3

No son mayo maneras de hacer eso, estoy por lo general con el evento del repetidor OnItemDataBound evento que ocurre cuando una pieza de repetidor es vinculado a un elemento de datos.

Para explicar el evento OnItemDataBound, supongamos que tenemos un repetidor con un campo que siempre se muestra (Nombre) y un campo opcional que se muestra si no es nulo (Opcional). Además, queremos mostrar un valor predefinido si el campo opcional es nulo o está vacío.
Para hacer esto, primero tenemos que configurar el evento OnItemDataBound del repetidor para que apunte a un método, y también para crear la plantilla de elementos del repetidor. Podríamos usar cualquier control de servidor dentro de la plantilla de elementos del repetidor al que podamos hacer referencia más adelante en el método OnItemDataBound.

<asp:Repeater ID="repeaterResults" runat="server" OnItemDataBound="repeaterResult_ItemDataDataBound"> 
    <ItemTemplate> 
    <strong><%#Eval("Name") %></strong> 
    <asp:Literal runat="server" ID="ltlOption" /> 
    <br /> 
    </ItemTemplate></asp:Repeater> 

Además supongamos que vamos a obligar a una colección de objetos simples que están teniendo dos propiedades: Nombre y opción como sigue:

public class SimpleEntity 
{ 
    public string Name {get;set;} 
    public string Option {get;set;} 
} 

A continuación vamos a poner en práctica el método repeaterResult_ItemDataDataBound de la siguiente manera:

protected void repeaterResult_ItemDataDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    SimpleEntity ent = e.Item.DataItem as SimpleEntity; 
    Literal ltlOption = e.Item.FindControl("ltlOption") as Literal; 
    if (ent != null && ltlOption != null) 
    { 
    if (!string.IsNullOrEmpty(ent.Option)) 
    { 
     ltlOption.Text = ent.Option; 
    } 
    else 
    { 
     ltlOption.Text = "Not entered!"; 
    } 

    } 
} 

Como se implementó el método anterior, mostraremos un campo opcional si existe, mientras que si el campo opcional es nulo o una cadena vacía, mostraremos predefinidos d cadena "¡No ingresado!".

8

Sugiero envolver cada par de clave/valor en control personalizado con 2 propiedades. Este control se mostrará sí solo si el valor no está vacío:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ShowPair.ascx.cs" Inherits="MyWA.ShowPair" %> 

<% if (!string.IsNullOrEmpty(Value)) 
    { %> 
<%=Key %> : <%=Value %> 
<% } %> 

y luego poner los controles en la plantilla repetidor:

<asp:Repeater runat='server' ID="repeater1"> 
    <ItemTemplate> 
     <cst:ShowPair Key="Company Name:" Value="<%#((Company)Container.DataItem).CompanyName %>" runat="server"/> 
     <cst:ShowPair Key="Contact Name:" Value="<%#((Company)Container.DataItem).ContactName %>" runat="server" /> 
     <cst:ShowPair Key="Address 1:" Value="<%#((Company)Container.DataItem).Address1 %>" runat="server" /> 
    </ItemTemplate> 
    </asp:Repeater> 
0

Soy consciente de que esta es una pregunta muy antigua, pero me gustaría agregue que tal vez la mejor manera de manejar este problema sea más a nivel de base de datos, y sí, sé que el OP no ha especificado ningún tipo de fuente de datos.

Simplemente voy a suponer (sí, culo de usted y de mí) que el lenguaje actual que se está utilizando es al menos Transact SQL.

Para este fin, tiendo a usar la fuente de datos para producir campos compuestos. En el caso de una dirección ISNULL, probaremos felizmente para ver qué campos están en uso, y devolverá un valor predeterminado si se encuentra un campo NULO. Además de esto, se pueden incluir caracteres separadores para permitir los saltos de línea en el medio de salida del objetivo. Una opción es usar coma + un espacio como delimitador ', '.

SELECT 
    ISNULL(src.address1 + ', ', '') + 
    ISNULL(src.address2 + ', ', '') + 
    ISNULL(src.address3 + ', ', '') + 
    ISNULL(src.address4 + ', ', '') + 
    ISNULL(src.postalcode, '') AS CompoundAddress 
... 

Esto funciona mediante el uso de NULL contra sí mismo - la adición a NULL devuelve un NULL, por lo tanto, el valor devuelto, o bien contener nuestra coma + espacio, o devolverá una cadena vacía.

Algo similar se puede hacer para 'truco' de Microsoft Access en la producción de su campo de dirección ...

SELECT 
    (src.address1 + ', ') & 
    (src.address2 + ', ') & 
    (src.address3 + ', ') & 
    (src.address4 + ', ') & 
    (src.postalcode) As CompoundAddress 
... 

En este caso el signo convertirá el NULL a una cadena vacía, pero la misma todavía se aplica a la adición de la cadena al campo potencialmente NULL.

Así que ahora, nos puede dar salida a nuestra dirección apropiada en el HTML ...

<div id="results"> 
    <asp:Repeater ID="repeaterResults" runat="server"> 
     <ItemTemplate> 
      Company:  <strong><%#Eval("CompanyName") %></strong><br /> 
      Contact Name: <strong><%#Eval("ContactName") %></strong><br /> 
      Address:  <strong><%#Eval("CompoundAddress").ToString().Replace(", ", "<br />") %></strong><br /> 
Cuestiones relacionadas