Пользовательские настройки приложения в ASP.NET - PullRequest
9 голосов
/ 09 июня 2011

Только что я наткнулся на ApplicationSettings в .NET WinForms, которые могут обрабатывать сложные типы.
В настоящее время я использую AppSettings в моих ASP.NET WebForms, которые могут обрабатывать только строки.
Могу ли я использовать ApplicationSettings в Webforms?Если так, то как?

Ответы [ 2 ]

38 голосов
/ 09 июня 2011

Основная идея:

  1. В другом проекте создайте классы, в которых будут храниться ваши пользовательские настройки.Например:

    public class EndPoint
    {
        public string HostName { get; set; }
        public int Port { get; set; }
    }
    
    public class EndPointCollection : Collection<EndPoint>
    {
    }
    
  2. Создайте проект, содержащий классы.

  3. Перейдите на вкладку Настройки в Свойства проекта .Он скажет, что файла настроек еще нет, и спросит, хотите ли вы его создать.

  4. Добавить новый файл настроек.В поле типа выберите Просмотр и введите полное имя класса.Например: ClassLibrary.EndPointCollection.Сохраните и перестройте проект.

  5. Нажмите кнопку редактирования значения настройки.(Обратите внимание, что это не будет доступно, если классы, созданные на предыдущем шаге, находятся в одном проекте.) Используйте пользовательский интерфейс для редактирования настроек.

    Visual Studio's settings value editor

  6. Если вы откроете файл web.config / app.config , вы увидите что-то вроде этого:

    ...
    <applicationSettings>
      <WebApplication1.Properties.Settings>
        <setting name="MyEndPoints"
                 serializeAs="Xml">
          <value>
            <ArrayOfEndPoint xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                             xmlns:xsd="http://www.w3.org/2001/XMLSchema">
              <EndPoint>
                <HostName>MyHostName</HostName>
                <Port>12345</Port>
              </EndPoint>
              <EndPoint>
                <HostName>MyHost1</HostName>
                <Port>1212</Port>
              </EndPoint>
            </ArrayOfEndPoint>
          </value>
        </setting>
      </WebApplication1.Properties.Settings>
    </applicationSettings>
    ...
    
  7. НаконецЧтобы прочитать эти настройки из вашего кода, просто используйте

    var endPointCollection = Settings.Default.MyEndPoints;
    

    Дизайнер создаст за кулисами объекты со строгой типизацией, чтобы позволить вышеуказанному работать.Вы можете увидеть полную информацию в файле Settings.Designer.cs.

Итог: вы можете делать все виды пользовательских настроек типа, если эти параметры имеют XmlSerializable или имеют преобразователь типа.Этот метод работает в веб-приложениях, WinForms, WPF, консольных приложениях и т. Д.

2 голосов
/ 26 июня 2013

Вот вариант принятого ответа с использованием следующего пользовательского класса для представления параметра:

namespace MyApplication
{
    public class EndPoint
    {
        public string HostName { get; set; }
        public int Port { get; set; }
    }
}

В принятом ответе предлагается использовать специализированный класс коллекции, EndPointCollection для хранения настроек. Однако я не думаю, что это необходимо; тип массива (EndPoint[]) также, кажется, работает.

Однако ввод типа массива в браузере типов не работает; вместо этого вы можете указать тип непосредственно в файле .settings (с помощью текстового редактора):

<Setting Name="MyEndPoints" Type="MyApplication.EndPoint[]" Scope="User">
    <Value Profile="(Default)" />
</Setting>

Кроме того, если редактор значений, показанный в принятом ответе, недоступен, вы можете вместо этого ввести значения непосредственно в поле значения, используя XML:

<ArrayOfEndPoint>
    <EndPoint>
        <HostName>MyHostName</HostName>
        <Port>12345</Port>
    </EndPoint>
    <EndPoint>
        <HostName>MyHost1</HostName>
        <Port>1212</Port>
    </EndPoint>
</ArrayOfEndPoint>

A setting with its value set to a complex value using the above XML.

Обратите внимание, что декларации пространства имен XML, которые генерирует Visual Studio, не являются необходимыми в XML, как показано выше.

...