ASP.NET MVC 2 - Установка значений в IValueProvider - PullRequest
9 голосов
/ 24 декабря 2009

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

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);
}

Ответы [ 3 ]

2 голосов
/ 25 января 2010

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

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

0 голосов
/ 25 января 2010

Я, вероятно, ошибаюсь, но какой префикс вы используете? Это связано с дочерними отношениями вашей модели?

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

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

Не уверен, поможет ли это тоже ...

0 голосов
/ 25 января 2010

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

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

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

...