Как отключить привязку значений маршрута в ASP.NET MVC? - PullRequest
3 голосов
/ 22 августа 2009

Как я знаю ValueProviderDictionary принимает значения для привязки из 3 мест

  1. Из почтовой формы
  2. Из значений маршрута
  3. Из строки запроса

Я хочу иметь возможность отключить второй и третий варианты. Единственное решение, которое я вижу здесь, - это создать свой собственный пользовательский ValueProvider (скопировать-вставить исходный файл ValueProviderDictionary и удалить из него эти две опции).

Правильно ли это решение? Есть ли более элегантные альтернативы?

(Если решение с пользовательским ValueProvider является правильным, где его следует инициализировать? В методе действия контроллера или в пользовательском ModelBinder?)

Спасибо

Ответы [ 2 ]

3 голосов
/ 22 августа 2009

Переопределите Controller.Initialize () и установите свойство ValueProvider в этом методе (после вызова base.Initialize ()).

Чтобы избежать переопределения всего ValueProviderDictionary, вы можете просто создать его подкласс. Единственная интересная часть состоит в том, что вам нужно будет скопировать небольшой фрагмент ValueProviderDictionary.PopulateDictionary (). В вашем конструкторе вызовите базовый конструктор, затем сразу this.Clear (), а затем this.YourCustomPopulateDictionary (). Это должно сделать ваш код намного меньше.

2 голосов
/ 26 августа 2009

Я создал атрибут Action и ValueProvider для решения этой проблемы. Назвал его GetValuesAttribute и StrictValueProviderDictionary соотв. Вы можете установить исходную форму, RouteData или QueryString. Например, если вы хотите, чтобы ValueProvider выполнял поиск значений в форме, и, возможно, QueryString напишите следующее над вашим методом или контроллером:

[GetValues(ValueSource.Form | ValueSource.QueryString)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formValues)
{
   ...
   UpdateModel(myModel); //model will be updated from mentioned sources

Исходный код находится здесь: http://codepaste.net/2kpzct. Единственная проблема в том, что он не будет работать, если вы захотите получить заполненную модель в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...