2009-12-24 24 views
9

我试图将我的MVC 1项目升级到MVC 2 RC。我们现在有一个自定义的模型绑定器,它将项目添加到ValueProvider中(当它是一本字典时,它可以工作)。然后我们将其传递给默认的模型绑定器。但是,IValueProvider没有添加方法,因此此算法不再有效。有谁知道在MVC 2中为ValueProvider添加值的方法吗?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实现自定义模型绑定器 – 2010-01-05 21:04:37

回答

2

的问题是,你到ModelBinder的时候,你的ValueProvider已经设置。以前,您可以在此时将值添加到您的ValueProvider。

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

+2

看起来实际上有一个更简单的解决方案。您可以简单地创建自己的ValueProvider并将其添加到Application_Start中的静态ValueProviderFactories.Factories集合中。 – 2010-01-26 13:35:38

0

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

ValueProviderDictionaryValueProviderCollection,FormCollection(以及更多)他们都实现IValueProvider

我不确定它是否有帮助。我不完全确定你想要做什么。我不必处理混淆后的参数。

+0

您可以使用派生类型的IValueProvider,但您必须将其连接到管道。 – 2010-01-25 16:59:00

+0

前两个已被弃用。 – Martin 2010-02-16 11:31:03

+0

MSDN页面确实表示'ValueProviderDictionary'已被弃用,但我没有看到它说'ValueProviderCollection'是什么? – Funka 2010-05-21 19:29:25

0

我可能弄错了,但是你使用的是什么前缀?这与你的模型的孩子关系有关吗?

如果没有,为什么不从DefaultModelBinder派生并覆盖BindModel()方法?这样,您可以拨打base.BindModel()并在之后操作这些值,但是您无法使用模型验证(请确保您阅读http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html,因为版本与RC的版本会有显着变化)。

从我猜测你试图做的更干净的方法是在这种情况下使用ViewModel。由于操作可能不平凡,您可能需要将输入和模型验证彼此分开。

不知道这是否有助于要么...

+0

基本上,我试图解密具有特定前缀的值。我们正在试图让我们的ViewModel不知道解密 - 他们只是有一个int,并且到达它们的时候它已经被解密了。所以,这不能解决问题。 – 2010-01-25 17:00:35