2010-09-23 7 views
5

Debo estar haciendo algo mal aquí pero no puedo encontrar una manera fácil de hacer que esto funcione.Establecer el valor de ListItem en constante para RadioButtonList en ASPX

imaginar el siguiente código:

<asp:RadioButtonList ID="MyRadioButtonList" runat="server"> 
    <asp:ListItem Value="<%= CompanyName.SystemName.Constants.PaymentFrequency.FREQUENT.ToString() %>" Text="Yes" Selected="True"></asp:ListItem> 
    <asp:ListItem Value="<%= CompanyName.SystemName.Constants.PaymentFrequency.ONCE.ToString() %>" Text="No, Just do this once"></asp:ListItem> 
</asp:RadioButtonList> 

Pero no compila la declaración antes de que se procesa la página. Entonces, si obtengo el valor seleccionado de esta lista de botones de radio, contiene algo así como "<% = Compan ...%>" en lugar de lo que define mi constante.

¿Cuál es la sintaxis correcta para esto?

+0

¿Por qué desea utilizar la enumeración en el marcado aspx donde se convierte en una cadena? Entonces, podría usar fácilmente "FRECUENTE" y "UNA VEZ" como valor en su lugar. Creo que no es posible acceder a la enumeración desde el aspx directamente cuando está en otra clase/espacio de nombres. Además: considere llamar a DataBind en RadioButtonList cuando desee evaluar los datos en el marcado. –

+0

1. Estas son constantes que se usan en todo el sistema (es bastante grande). De esta manera son fácilmente manejables. 2. Si simplemente imprimo la declaración en lugar de asignarla a la propiedad Value, funciona. 3. Solo enlaza datos con una información cuando adjunta una fuente de datos, que no estoy usando. – Peter

+0

¡Tengo el mismo problema exactamente! – TinyRacoon

Respuesta

4

No sé exactamente por qué (no logré encontrar una referencia) pero la sintaxis <%= %> no funciona cuando configura el valor o el texto de un elemento de lista, en el marcado ASPX.

en su lugar podría hacerlo desde código subyacente, como:

MyRadioButtonList.Items.Add(new ListItem(
    "Yes", CompanyName.SystemName.Constants.PaymentFrequency.FREQUENT.ToString())); 
//... 
+2

¿Olvidaron accidentalmente poner esto adentro o algo así? Esto apesta :-) – Peter

+0

Aquí hay una explicación de por qué no funciona: http://stackoverflow.com/a/370263/12484 –

1

Si realmente quiere las constantes en el marcado (no en el código detrás por la respuesta aceptada), ya que ASP.NET 2.0 esto puede ser hecho con un ExpressionBuilder personalizado.

En primer lugar, crear una clase ExpressionBuilder en su aplicación web:

namespace Your.Namespace 
{ 
    [ExpressionPrefix("Code")] 
    public class CodeExpressionBuilder : ExpressionBuilder 
    { 
     public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, 
      object parsedData, ExpressionBuilderContext context) 
     { 
      return new CodeSnippetExpression(entry.Expression); 
     } 
    } 
} 

continuación, se registra en su web.config:

<compilation debug="true"> 
    <expressionBuilders> 
    <add expressionPrefix="Code" type="Your.Namespace.CodeExpressionBuilder"/> 
    </expressionBuilders> 
</compilation> 

Por último, la llaman en su margen de beneficio mediante la sintaxis <%$ %>:

<asp:RadioButtonList ID="MyRadioButtonList" runat="server"> 
    <asp:ListItem Value="<%$ Code: CompanyName.SystemName.Constants.PaymentFrequency.FREQUENT.ToString() %>" Text="Yes" Selected="True"></asp:ListItem> 
    <asp:ListItem Value="<%$ Code: CompanyName.SystemName.Constants.PaymentFrequency.ONCE.ToString() %>" Text="No, Just do this once"></asp:ListItem> 
</asp:RadioButtonList> 

Obtuve la mayor parte del código de aquí:

http://weblogs.asp.net/infinitiesloop/The-CodeExpressionBuilder

MSDN ASP.NET general sobre las expresiones

https://msdn.microsoft.com/en-us/library/d5bd1tad.aspx

MSDN ExpressionBuilder Referencia de la Clase

https://msdn.microsoft.com/en-us/library/system.web.compilation.expressionbuilder(v=vs.110).aspx

Cuestiones relacionadas