ASP.NET MVC 2 - 在IValueProvider上设置值

时间:2009-12-24 16:44:14

标签: asp.net-mvc asp.net-mvc-2 modelbinders

我正在尝试将我的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);
}

3 个答案:

答案 0 :(得分:2)

问题在于,当您到达ModelBinder时,您的ValueProvider已经设置好了。以前,您可以在此时向ValueProvider添加值。

为了提供Custom ValueProvider,您需要覆盖ControllerActionInvoker,这是最终的解决方案。不幸的是,ControllerActionInvoker是由Controller对象创建的,而不是被注入。因此,您还需要覆盖Controller以调用您自己的ControllerActionInvoker。

答案 1 :(得分:0)

你不能使用IValueProvider的派生类型之一吗? (甚至创建自己的,但在框架中似乎有不错的实现)

ValueProviderDictionaryValueProviderCollectionFormCollection (以及更多)他们都实施了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。由于操作可能非常简单,您可能希望将输入和模型验证彼此分开。

不确定这是否有帮助...