2011-05-20 31 views
8

que podría estar completamente fuera de pista por ahora, así que sólo voy a pedir esto aquí para que alguien me puede ayudar.valor obtener de applicationSettings web.config en ASP.NET marcado

Lo que yo quiero hacer, es insertar un valor de mi web.config, almacenado en un área applicationSettings, en mi marcado aspx. Específicamente, quiero leer una URL de config. Esta es la configuración configSection utilizo

<configSections> 
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=123456"> 
    <section name="MyApp.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=12345" requirePermission="false" /> 
</configSections> 

Más tarde, en ese archivo son los ajustes reales de este modo:

<applicationSettings> 
<MyApp.Properties.Settings> 
    <setting name="ImagesUrl" serializeAs="String"> 
    <value>http://resources/images/</value> 
    </setting> 

Ahora quiero hacer referencia al valor anterior en el marcado de esta manera:

<asp:Image ID="Image1" runat="server" ImageUrl="<%$AppSettings:ImagesUrl%>/Image1.jpg 

sé que hay una expresión disponibles <% $ appSettings: ImagesUrl%>, pero no estoy usando la parte appsettings de web.config, en lugar del configSection.

EDIT: Creo que solo puedo hacerlo con ExpressionBuilder, porque tengo que concatenar la cadena con el nombre de la imagen individual. Cambié el ejemplo anterior para reflejar eso.

me gusta Solución Código Smith Bert a continuación para acceder a la sección de configuración, lo único que necesita para ponerlo en un generador de expresiones. Estoy atascado al anular el método GetCodeExpression desde el que llamaría a Configuration Manager, pero no entiendo cómo crear una expresión de los parámetros.

public class SettingsExpressionBuilder: ExpressionBuilder 
{ 
    public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context) 
    { 
     return ?? 
    } 

EDITAR
El resultado es idéntico, y funciona para todo tipo de archivos, no sólo imágenes:

<asp:ScriptReference Path='<%$Code:GetAppSetting("ResourcesUrl","JS/jquery/jquery.jqplot.js")%>' 

y simplemente usó el ejemplo de Microsoft para devolver cualquier tipo de código del generador de expresiones:

retorno nueva CodeSnippetExpression (entry.Expression);

Y GetAppSetting es un método en mi clase de página personalizada.

+0

"Podría ser completamente fuera de pista por ahora" .. Yo diría que si está almacenando enlaces a la imagen recursos en un archivo web.config, entonces sí, estás muy equivocado. – NotMe

+0

Después de reflexionar, podría estar leyendo esto mal. ¿Está almacenando la parte inicial de la referencia externa o toda la ubicación de la imagen? Lo que lleva a la siguiente pregunta: ¿esto es realmente compatible con múltiples entornos (prueba, escenario, prod)? – NotMe

+0

Sí, solo la primera parte de la URL, así que puedo cambiar eso en diferentes entornos –

Respuesta

10

Por lo general, se crearía una clase de configuraciones personalizadas para leer estos valores como este artical describe. Personalmente, simplemente usaría la configuración de la aplicación como se sugirió anteriormente, ya que esta es una funcionalidad existente y por lo que su trabajo en la superficie parece adecuado.

Sin embargo, sin saber su situación, lo que su tratando de hacer podría resolverse sin los ajustes personalizados, así:

en el código detrás creé una función protegida para recuperar el ajuste

protected string GetCustomSetting(string Section, string Setting) 
{ 
    var config = ConfigurationManager.GetSection(Section); 

    if (config != null) 
     return ((ClientSettingsSection)config).Settings.Get(Setting).Value.ValueXml.InnerText; 

    return string.Empty; 
} 

Luego en el marcado aspx llamo a esta función

<div> 
    <label runat="server" id="label"><%=GetCustomSetting("applicationSettings/MyApp.Properties.Settings", "ImagesUrl") %></label> 
</div> 

Espero que esto ayude.

Seguimiento:

El CodeExpression se verá algo como esto:

public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context) 
{ 
    var config = ConfigurationManager.GetSection("applicationSettings/MyApp.Properties.Settings"); 
    return new CodePrimitiveExpression(((ClientSettingsSection)config).Settings.Get(entry.Expression).Value.ValueXml.InnerText); 
} 

En mi prueba, he creado una clase llamada CustomSettingsExpressionBuilder y ha añadido a la carpeta App_Code. Agregó la configuración para el encargo expreso al web.config y lo llamó desde aspx, así:

<asp:Label ID="Label1" runat="server" Text="<%$CustomSettings:ImagesUrl %>"></asp:Label> 
+0

Me gusta la idea, pero no puedo usar funciones personalizadas en los controles del servidor. _ "Las etiquetas de servidor no pueden contener construcciones <%...%>" _ –

+0

Esperemos que la sección de seguimiento sea lo que estás buscando. Si es necesario, puedo publicar toda la clase, pero parecía que iba en la dirección correcta. –

+0

Esto no es lo que implementé al final, pero se acercó. El problema es que todavía no puedo agregar el nombre de la imagen, a menos que pueda separar la cadena de "entrada" en el exprBuilder o tener más de un parámetro. Ahora uso otro expressionBuilder que ya tenía en una publicación de blog, que compila cualquier código válido de C#. Creé un método que devuelve la cadena solicitada appSetting y puedo concatenar el nombre de la imagen. <% $ Código: GetAppSetting ("ResourcesUrl") + "images/image.jpg"%> –

0

no estoy seguro sobre el bit de ASP.NET de ella, pero si esto era código normal que harías MyApp.Properties.Settings.Default.ImagesUrl, así que intenta

<asp:Image ID="Image1" runat="server" 
      ImageUrl="<%$MyApp.Properties.Settings.Default.ImagesUrl%> 

Definitivamente sería más fácil de almacenar esto en <appSettings> aunque .

1

¿Tiene que estar en marcado? ¿Por qué no lo configuras en código subyacente?

Image1.ImageUrl= //fetch your settings here. 

una u otra forma sería definir una propiedad o un método estático de código subyacente y luego usar ese en el marcado.

Cuestiones relacionadas