2008-11-05 39 views
6

Tengo un repetidor y su SqlDatasource anidado dentro de un Gridview TemplatedField.
El origen de datos del repetidor SelectCommand se establece utilizando FormatString de una Eval desde la vista Grid.
El SelectCommand tiene una cláusula WHERE que consiste en comparar una cadena.
Como ya he utilizado las comillas simple y doble, tengo problemas para delimitar la cadena en la cláusula WHERE de SQL.Cómo utilizar comillas simples en cadena de formato Eval

¿Cómo agrego comillas simples dentro de una Eval FormatString?

He intentado con 'Replace'.
He intentado usar 'Special Characters' (... DONDE Stringfield = ' {0} ' ...)

No hubo suerte hasta ahora. Agradezco cualquier ayuda que pueda ofrecer.

<asp:GridView ID="GridView1" runat="server" DataSourceID="DataSource1" DataKeyNames="Foo" AutoGenerateColumns="False" AllowSorting="true" > 
    <Columns> 
     <asp:BoundField DataField="Foo" HeaderText="Foo" SortExpression="Foo" /> 
     <asp:BoundField DataField="Bar" HeaderText="Bar" SortExpression="Bar" /> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:Repeater ID="Repeater1" runat="server" DataSourceID="DataSourceNested"> 
        <ItemTemplate> 
         <asp:Label ID="Label1" runat="server" Text='<%# Eval("Blah") %>'></asp:Label> 
        </ItemTemplate> 
       </asp:Repeater> 
       <asp:SqlDataSource ID="DataSourceNested" runat="server" DataFile="~/App_Data/DatabaseName" 
        SelectCommand='<%# Eval("Bar", "SELECT Blah FROM TableName WHERE (StringField = {0})") %>' > 
       </asp:SqlDataSource> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

Respuesta

10

No se olvide que una página .aspx es simplemente XML. Simplemente escapa de las citas como lo haría normalmente.

Por ejemplo:

<asp:Repeater ID="repeatTheLabel" runat="server"> 
    <ItemTemplate> 
     <asp:Label ID="Label1" Text="<%# Eval(&quot;Id&quot;, &quot;This is item '{0}'.&quot;) %>" runat="server" /> 
    </ItemTemplate> 
    <SeparatorTemplate> 
     <br /> 
    </SeparatorTemplate> 
</asp:Repeater> 

Cuando la expresión anterior se DataBound el valor entre <%# y %> se convierte en:

Eval("Id", "This is item '{0}'.")

... que produce en la página HTML como salida cuando se une a datos con una matriz de objetos con valores de propiedad "Id" de 1 a 5:

Este es el elemento '1'.
Este es el elemento '2'.
Este es el elemento '3'.
Este es el elemento '4'.
Este es el elemento '5'.

+0

Hola, Aydsman, he intentado usar " y esta técnica no funciona. La página activa 'Mensaje de error del compilador: BC32017: Coma,') ', o se espera una continuación de expresión válida'. Podría estar equivocado, pero creo que el motor de renderizado ASP.NET debe convertirlo en una cotización antes de lo requerido. – Dhaust

+0

Eso es extraño David. El código de la etiqueta que publiqué allí fue probado y funcionó bien. –

+0

Creo que es el hecho de que lo estoy haciendo dentro de una cadena de formato Eval que está causando el problema. ¿Podría ser que Eval esté convirtiendo el '"' en una cotización y luego aparece el motor de representación de ASP.NET y activa el error? No estoy seguro. – Dhaust

0

¿Has probado a escapar de los comillas simples?

... WHERE (StringField = \'{0}\') ... 
+0

Hola Ty, acabo de intentarlo (lo vi en http://weblogs.asp.net/jgalloway/archive/2005/10/15/427577.aspx), pero dio un puntapié al error "La etiqueta del servidor no está bien formada" en la línea de declaración del origen de datos. – Dhaust

+0

Y para asegurarme de no haber arruinado otra cosa con la etiqueta de fuente de datos, cambié el SQL para utilizar un entero en WHERE en lugar de una cadena y funcionó perfectamente. No devuelve los datos que necesito, pero probó que la declaración de fuente de datos y el SQL no fueron reventados. – Dhaust

2

¿Por qué no define esta cláusula WHERE como una const en su código detrás? Definir:

protected const string SELECTCLAUSE = 
"SELECT Blah FROM TableName WHERE (StringField = '{0}')"; 

Entonces sería su propiedad SelectCommand:

SelectCommand='<%# Eval("Bar", SELECTCLAUSE) %>' 
+0

Gracias Keltex, eso funciona. Y por favor no te ofendas, pero tiene que haber una solución más elegante. Simplemente se siente como una especie de "fuerza bruta" ... es hacerlo de esa manera. Alguien más tiene alguna otra idea? – Dhaust

2

Almacene sus consultas sql en propiedades en su clase de página. No solo funciona :-) sino que hace que tu código sea más fácil de leer y mantener.

Ah, y debería usar parámetros en sus consultas en lugar de hacer reemplazos de cadena. Eso resolverá el problema eliminando la necesidad de comillas simples.

Cuestiones relacionadas