Поставщики значений

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Как уже говорилось в начале главы, для поиска значений привязчик модели использует специальные компоненты - поставщики значений (value providers). Поставщики значений предоставляют доступ к информации, которая затем используется в привязке модели.

Поставщики значений поставляются фабриками поставщиков значений (value provider factories) и системой поиска данных для этих поставщиков значений в том порядке, в котором они зарегистрированы (регистрация по принципу очереди - вверху первый, внизу последний). Разработчики могут создавать свои собственные фабрики и поставщики значений и добавлять их в список фабрик ValueProviderFactories.Factories. Для предоставления дополнительного источника данных для привязки модели разработчики могут применить фабрику или поставщик значений.

Все поставщики значений реализуют интерфейс IValueProvider:

public interface IValueProvider
{
    bool ContainPrefix (string prefix);
	ValueProviderResult GetValue (string key);
}

В конкретных реализациях метод ContainPrefix сопоставляет некоторые данные с указанным префиксом, а метод GetValue получает данные для определенного ключа.

Создадим свой поставщик значений. Пусть, к примеру, он будет получать для нас название браузера пользователя. Определим поставщик:

    public class BrowserValueProvider : IValueProvider
    {
        public bool ContainsPrefix(string prefix)
        {
            return string.Compare("browser", prefix, true) == 0;
        }

        public ValueProviderResult GetValue(string key)
        {
            return ContainsPrefix(key) ? new ValueProviderResult("Ваш браузер: "+HttpContext.Current.Request.Browser.Browser, null,
                CultureInfo.InvariantCulture) : null;
        }
    }

В методе GetValue, если ключ совпадает с префиксом, то мы возвращаем объект ValueProviderResult, в конструктор которого передаем три параметра - первый параметр принимает значение, ассоциируемое с ключом. Второй параметр используется для отслеживания ошибок, А в третьем параметре передается информация о культуре, с которое ассоциируется значение. В данном случае второй и третий параметр нам не столь важны.

Как уже писалось выше, чтобы задействовать свой поставщик значений, нам надо определить фабрику поставщика:

    public class BrowserValueProviderFactory : ValueProviderFactory
    {
        public override IValueProvider GetValueProvider(ControllerContext controllerContext)
        {
            return new BrowserValueProvider();
        }
    }

И в конце нам надо зарегистрировать фабрику поставщика значений в файле Global.asax:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        ValueProviderFactories.Factories.Add(new BrowserValueProviderFactory());
			
        //......................................................
    }
}

В данном случае мы добавляем наш поставщик в конец коллекции ValueProviderFactories.Factories. Фреймворк просматривает последовательно все фабрики поставщиков значений в порядке регистрации. Если будет найден соответствующий поставщик, то следующие после него уже не используются.

В нашем случае это не имеет значения. Однако если возникнет необходимость поставить свою фабрику поставщика значений на первое место в списке, то мы можем сделать это следующим образом: ValueProviderFactories.Factories.Insert(0, new BrowserValueProviderFactory());

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

public string BrowserInfo(string browser)
{
    return browser;
}

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

Как вы видите, мы не оправляем в форме или в строке запроса параметр browser и его значение. Его находит сам наш поставщик.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850