代码之家  ›  专栏  ›  技术社区  ›  Keith Rousseau

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

  •  9
  • Keith Rousseau  · 技术社区  · 15 年前

    我正在尝试将我的MVC1项目升级到MVC2RC。我们目前有一个自定义的modelbinder,它向ValueProvider添加项(当它是一个字典时,它就起作用了)。然后我们将其传递给默认的modelbinder。但是,IValueProvider没有add方法,因此该算法不再有效。有人知道在MVC2中向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 回复  |  直到 14 年前
        1
  •  2
  •   Keith Rousseau    14 年前

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

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

        2
  •  0
  •   mtmk    14 年前

    您不能使用的派生类型之一 IValueProvider

    ValueProviderDictionary . ValueProviderCollection , FormCollection (还有更多)他们都实施了 IValueProvider

    我不确定这是否有帮助。我不完全确定你想做什么。我没必要和那些邮差混在一起。

        3
  •  0
  •   mnemosyn    14 年前

    我可能弄错了,但你用的前缀是什么?那跟你模特儿的关系有关吗?

    如果不是,为什么不从 DefaultModelBinder 并覆盖 BindModel() 方法?那样的话,你可以打电话 base.BindModel() 然后操作这些值,但是不能使用模型验证(请确保阅读 http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html ,因为与RC相比,版本将有重大变化)。

    从我可以猜到的情况来看,更干净的方法是在本例中使用ViewModel。由于操作可能非常复杂,您可能希望将输入和模型验证彼此分离。

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