Получить значение из web.config applicationSettings в разметке ASP.NET

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

Что я хочу сделать, так это вставить значение из моего web.config, хранящегося в области applicationSettings, в мою разметку aspx. В частности, я хочу прочитать URL-адрес из config. Это настройка 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 ??
    }

РЕДАКТИРОВАНИЕ
Результат выглядит следующим образом и подходит для всех типов файлов, а не только для изображений:

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

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

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

А GetAppSetting — это метод в моем пользовательском классе Page.


person Niels Ziegler    schedule 20.05.2011    source источник
comment
Возможно, я уже совсем сбился с пути. Я бы сказал, что если вы храните ссылки на ресурсы изображений в файле web.config, то да, вы сильно сбились с пути.   -  person NotMe    schedule 20.05.2011
comment
Поразмыслив, я мог бы прочитать это неправильно. Вы просто сохраняете начальную часть внешней ссылки или все местоположение изображения? Что приводит к следующему вопросу: действительно ли это поддерживает несколько сред (тест, этап, производство)?   -  person NotMe    schedule 20.05.2011
comment
Да, только первая часть URL-адреса, поэтому я могу изменить ее в разных средах.   -  person Niels Ziegler    schedule 23.05.2011


Ответы (3)


Как правило, вы должны создать класс настраиваемых параметров для считывания этих значений в виде 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>
person Bert Smith    schedule 20.05.2011
comment
Мне нравится эта идея, но я не могу использовать пользовательские функции в серверных элементах управления. Теги сервера не могут содержать конструкции ‹%...%› - person Niels Ziegler; 23.05.2011
comment
Надеемся, что следующий раздел — это то, что вы ищете. Если нужно, я могу опубликовать весь класс, но похоже, что вы движетесь в правильном направлении. - person Bert Smith; 23.05.2011
comment
Это не то, что я реализовал в конце, но это было близко. Проблема в том, что я все еще не могу добавить имя изображения, если, возможно, я не смогу разделить строку ввода в exprBuilder или иметь более одного параметра. Поэтому теперь я использую другой expressionBuilder, который у меня уже был из сообщения в блоге, который компилирует любой допустимый код C#. Я создал метод, который возвращает запрошенную строку appSetting, и я могу просто объединить имя изображения. ‹%$Code:GetAppSetting(ResourcesUrl) + images/image.jpg %› - person Niels Ziegler; 24.05.2011

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

Image1.ImageUrl= //fetch your settings here.

Еще один способ — определить свойство или статический метод в коде программной части, а затем использовать его в разметке.

person gbs    schedule 20.05.2011

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

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

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

person Graham Clark    schedule 20.05.2011