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

#asp.net #web-config #markup #expressionbuilder #configsection

#asp.net #web-config #разметка #expressionbuilder #configsection

Вопрос:

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

Что я хочу сделать, так это вставить значение из моего 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, потому что мне нужно объединить строку с именем отдельного изображения. Я изменил приведенный выше пример, чтобы отразить это.

Мне нравится приведенное ниже кодовое решение Берта Смита для доступа к разделу конфигурации, только мне нужно поместить его в конструктор выражений. Я застрял на переопределении метода 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.

Комментарии:

1. «Возможно, я уже полностью сбился с пути».. Я бы сказал, что если вы храните ссылки на ресурсы изображения в файле web.config, то да, вы сильно сбились с пути.

2. Поразмыслив, я, возможно , читаю это неправильно. Вы сохраняете только начальную часть внешней ссылки или все расположение изображения целиком? Что приводит к следующему вопросу: действительно ли это поддерживает несколько сред (test, stage, prod)?

3. Да, только первая часть URL, поэтому я могу изменить это в разных средах

Ответ №1:

Обычно вы создаете пользовательский класс настроек для считывания этих значений, как описано в этой статье. Лично я бы просто использовал 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>
  

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

Последующие действия:

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

 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. Добавил конфигурацию для пользовательского express в web.config и вызвал ее из aspx следующим образом:

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

Комментарии:

1. Мне нравится идея, но я не могу использовать пользовательские функции в серверных элементах управления. «Теги сервера не могут содержать конструкции <%…%>»

2. Надеюсь, последующий раздел — это то, что вы ищете. Если понадобится, я могу опубликовать весь урок, но, похоже, вы двигались в правильном направлении.

3. Это не то, что я реализовал в конце, но это было близко. Проблема в том, что я все еще не могу добавить имя изображения, если, возможно, я не смогу разобрать строку «entry» отдельно в exprBuilder или иметь более одного параметра. Итак, теперь я использую другой expressionBuilder, который у меня уже был из записи в блоге, который компилирует любой допустимый код на C #. Я создал метод, который возвращает запрошенную строку appSetting, и я могу просто объединить имя изображения. <%$Code:GetAppSetting(«ResourcesUrl») «images/image.jpg » %>

Ответ №2:

Обязательно ли это должно быть в markup? Почему бы вам не установить его в code-behind.

 Image1.ImageUrl= //fetch your settings here.
  

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

Ответ №3:

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

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

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