9

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

3 回答 3

2

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

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

于 2010-01-25T16:58:01.873 回答
0

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

值提供者字典ValueProviderCollectionFormCollection(以及更多)它们都实现了IValueProvider

我不确定它是否有帮助。我不完全确定您要做什么。我不必处理那么多与 post 参数混合的问题。

于 2010-01-25T15:45:46.030 回答
0

我可能会误会您的意思,但是您使用的这个前缀是什么?这与您的模型的子关系有关吗?

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

从我猜你尝试做的事情来看,更简洁的方法是在这种情况下使用 ViewModel。由于操作可能很重要,您可能希望将输入和模型验证彼此分开。

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

于 2010-01-25T16:08:13.423 回答