Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Как уже говорилось в начале главы, для поиска значений привязчик модели использует специальные компоненты - поставщики значений (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
и его значение. Его находит сам наш поставщик.