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