2009-12-24 2 views
9

Я пытаюсь обновить проект MVC 1 до MVC 2 RC. В настоящее время у нас есть настраиваемый элемент modelbinder, который добавляет элементы в ValueProvider (это сработало, когда это был словарь). Затем мы передали это стандартное устройство для моделирования. Однако у IValueProvider нет метода добавления, поэтому этот алгоритм больше не работает. Кто-нибудь знает способ добавления значений в ValueProvider в MVC 2?ASP.NET MVC 2 - Установка значений на IValueProvider

foreach(string valKey in controllerContext.RequestContext.HttpContext.Request.Form.AllKeys.Where(x => x.StartsWith(valuesToChangePrefix))) 
{ 
    string valName = valKey.Substring(valuesToChangePrefix.Length); 

    string myVal = ManipulateValue(bindingContext.ValueProvider.GetValue(valKey).AttemptedValue); 

    // This is where I need to add to my value Provider (As you can see I used to just assign a ValueProviderResult 
    //bindingContext.ValueProvider = new ValueProviderResult(myVal.Split(','), myVal, bindingContext.ValueProvider.GetValue(valKey).Culture); 
} 
+2

Такая же проблема на данный момент, я не могу найти достойную документацию о том, как реализовать пользовательские привязки моделей для MVC2 в любом месте –

ответ

2

Проблема заключается в том, что к тому времени, когда вы к ModelBinder, ваш ValueProvider уже установлен. Раньше вы могли бы добавить значения к вашему ValueProvider в этот момент.

Чтобы предоставить пользовательский ValueProvider, вам необходимо переопределить ControllerActionInvoker, который является окончательным решением. К сожалению, ControllerActionInvoker создается объектом Controller вместо того, чтобы вводиться. Поэтому вам также необходимо переопределить контроллер, чтобы вызвать собственный ControllerActionInvoker.

+2

Похоже, что на самом деле это более простое решение. Вы можете просто создать свой собственный ValueProvider и добавить его в статическую коллекцию ValueProviderFactories.Factories в Application_Start. –

0

Не можете ли вы использовать один из производных типов IValueProvider? (или даже создать свои собственные, но, похоже, в каркасе есть достойные реализации)

ValueProviderDictionary. ValueProviderCollection, FormCollection (и еще пара) все они реализуют IValueProvider.

Я не уверен, если это поможет. Я не совсем уверен, что вы пытаетесь сделать. Мне не приходилось иметь дело с смешением с такими параметрами.

+0

Вы можете использовать производный тип IValueProvider, но вы должны подключить его вверх по трубопроводу. –

+0

Первые два устарели. – Martin

+0

На странице MSDN говорится, что 'ValueProviderDictionary' устарел, но я не видел, где он говорит, что имеет значение ValueProviderCollection? – Funka

0

Возможно, вы ошибаетесь, но что это за префикс, который вы используете? Связано ли это с детским отношением вашей модели?

Если нет, то почему бы не проистекать из DefaultModelBinder и переопределить метод BindModel()? Таким образом, вы можете позвонить base.BindModel() и впоследствии управлять значениями, однако вы не можете использовать проверку модели тогда (убедитесь, что вы читаете http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html, потому что в релизе будет значительное изменение в сравнении с RC).

Более чистый подход, исходя из того, что я могу угадать, вы пытаетесь сделать, заключается в использовании ViewModel в этом случае. Поскольку манипуляция, вероятно, нетривиальна, вам может потребоваться отделить проверку ввода и модели друг от друга.

Не уверен, если это помогает либо ...

+0

В основном, я пытаюсь расшифровать значения, имеющие определенный префикс. Мы пытаемся сделать так, чтобы наши ViewModels не знали о расшифровке - у них просто есть int, и к тому времени, когда они добираются до них, он был расшифрован. Таким образом, это не решает проблему. –

Смежные вопросы