我正在尝试将我的MVC 1项目升级到MVC 2 RC。我们目前有一个自定义模型绑定器,它将项目添加到ValueProvider(这在字典时起作用)。然后我们将其传递给默认的模型绑定器。但是,IValueProvider没有add方法,因此该算法不再有效。有谁知道在MVC 2中为ValueProvider添加值的方法?
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);
}
答案 0 :(得分:2)
问题在于,当您到达ModelBinder时,您的ValueProvider已经设置好了。以前,您可以在此时向ValueProvider添加值。
为了提供Custom ValueProvider,您需要覆盖ControllerActionInvoker,这是最终的解决方案。不幸的是,ControllerActionInvoker是由Controller对象创建的,而不是被注入。因此,您还需要覆盖Controller以调用您自己的ControllerActionInvoker。
答案 1 :(得分:0)
你不能使用IValueProvider的派生类型之一吗? (甚至创建自己的,但在框架中似乎有不错的实现)
ValueProviderDictionary。 ValueProviderCollection,FormCollection (以及更多)他们都实施了IValueProvider。
我不确定它是否有帮助。我不完全确定你要做什么。我没有必要处理那么多的事情。
答案 2 :(得分:0)
我可能会误解你,但你使用的这个前缀是什么?这与您的模型的子关系有关吗?
如果没有,为什么不从DefaultModelBinder
派生并覆盖BindModel()
方法呢?这样,您可以调用base.BindModel()
并在之后操纵值,但是您无法使用模型验证(请务必阅读http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html,因为版本与版本相比会发生重大变化RC)。
从我猜测你尝试做的更简洁的方法是在这种情况下使用ViewModel。由于操作可能非常简单,您可能希望将输入和模型验证彼此分开。
不确定这是否有帮助...