Получить значение из web.config applicationSettings в разметку ASP.NET - PullRequest
8 голосов
/ 20 мая 2011

Возможно, я уже совсем не в курсе, поэтому я просто спрошу это здесь, чтобы кто-нибудь мог мне помочь.

Что я хочу сделать, это вставить значение из моего файла web.config, хранящегося в области applicationSettings, в мою разметку aspx.В частности, я хочу прочитать URL-адрес из конфигурации.Это настройка configSection, которую я использую

<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>

Позже в этом файле находятся настоящие настройки, например, так:

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

Теперь я хочу сослаться на вышеуказанное значение в разметке следующим образом:

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

Я знаю, что доступно выражение <% $ AppSettings: ImagesUrl%>, но я не использую часть appsettings файла web.config, а configSection.

РЕДАКТИРОВАТЬ: я думаю, что я могу сделать это только с ExpressionBuilder, потому что мне нужно объединить строку с именем отдельного изображения.Я изменил приведенный выше пример, чтобы отразить это.

Мне нравится Bert Smith Code Solution ниже для доступа к разделу конфигурации, только мне нужно поместить его в построитель выражений.Я застрял в переопределении метода GetCodeExpression, из которого я бы вызвал Configuration Manager, но я не понимаю, как построить выражение для параметров.

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

EDIT
Результат выглядит следующим образом и работает для всех видов файлов, а не только для изображений:

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

, и я просто использовал пример от Microsoft для возврата любого вида кода из построителя выражений:

вернуть новое CodeSnippetExpression (entry.Expression);

И GetAppSetting - это метод в моем классе пользовательской страницы.

Ответы [ 3 ]

11 голосов
/ 20 мая 2011

Обычно вы создаете класс пользовательских настроек для считывания этих значений, как описано в artical . Лично я бы просто использовал appSettings, как предложено выше, так как это существующая функциональность, и то, что вы делаете на поверхности, кажется адекватным.

Однако, не зная ваших обстоятельств, то, что вы пытаетесь сделать, может быть решено без пользовательских настроек, таких как:

В коде позади я создал защищенную функцию для получения настройки

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;
}

Затем в разметке aspx я вызываю эту функцию

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

Надеюсь, это поможет.

Продолжение:

CodeExpression будет выглядеть примерно так:

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);
}

В своем тесте я создал класс с именем CustomSettingsExpressionBuilder и добавил его в папку App_Code. Добавил конфигурацию для пользовательского экспресса в web.config и назвал его из aspx так:

<asp:Label ID="Label1" runat="server" Text="<%$CustomSettings:ImagesUrl %>"></asp:Label>
1 голос
/ 20 мая 2011

Должен ли он быть в разметке? Почему бы вам не установить это в коде позади.

Image1.ImageUrl= //fetch your settings here.

Другим способом было бы определить свойство или статический метод в вашем коде и затем использовать его в разметке.

0 голосов
/ 20 мая 2011

Я не уверен насчет ASP.NET, но если бы это был нормальный код, вы бы сделали MyApp.Properties.Settings.Default.ImagesUrl, поэтому попробуйте

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

Хотя определенно было бы проще хранить это в <appSettings>.

...