gpt4 book ai didi

asp.net-mvc-3 - 如何将模型绑定(bind)中使用的所有 ValueProviderResult 的文化设置为给定值?

转载 作者:行者123 更新时间:2023-12-04 15:23:41 24 4
gpt4 key购买 nike

原来MVC的DefaultModelBinder使用不同的文化来解析 POST 和 GET 请求的值(例如 doubleDateTime 等)。
Here是更多信息。

我看到这是由 Culture 控制的。 ValueProviderResult 的属性(property)对象,从 IValueProvider.GetValue() 返回.

我的问题是:我如何在全局范围内确保此值始终为 CultureInfo.InvariantCulture。

我知道我可以实现自定义值提供程序并这样做。

我知道我可以实现自定义模型绑定(bind)器并这样做。

我知道我可以在线程中设置文化,但不幸的是,这不是我的选择。

我正在寻找的是一种设置它的方法,以便即使默认模型绑定(bind)器和现有的值提供者也能够以文化不变的方式进行解析,而不管线程文化设置为什么。

最佳答案

据我所知,没有办法符合您的标准。您将不得不做一件您知道可以做的事情(我想说最合适的方法是自定义值(value)提供者)。

原因:所有默认的 ValueProvider 都被硬编码为使用 CultureInfo.InvariantCultureCultureInfo.CurrentCulture .

这里,具体来说,是FormValueProvider的方式可以:

internal FormValueProvider(
ControllerContext controllerContext,
IUnvalidatedRequestValues unvalidatedValues
)
: base(
controllerContext.HttpContext.Request.Form,
unvalidatedValues.Form,
CultureInfo.CurrentCulture // <--- Grrr, argh
)
{
}

文化不会从其他任何地方检索(即,上面的参数不用作默认值,而是用作要使用的一种文化)。

不同 IValueProviders 的文化

作为引用,这些是每个默认 IValueProviders 的文化:
  • ChildActionValueProvider: InvariantCulture
  • 表单值提供者:当前文化
  • JsonValueProvider:当前文化
  • RouteDataValueProvider: InvariantCulture
  • QueryStringValueProvider:InvariantCulture
  • HttpFileCollectionValueProvider: InvariantCulture

  • 更换CurrentCulture IValueProviders

    替换 FormValueProvider 并不是一项艰巨的任务,因为,如上所示,它只是调用其基类的( NameValueCollectionValueProvider)构造函数——它将所需的文化作为参数。

    FormValueProvider 的原始实现表面上看起来比实际上更难,它引用了内部类和接口(interface)。但是它们并不是替换提供者所必需的——它们只是用于单元测试。

    您只需要调用基本构造函数(如上所述),传递两个 NameValueCollection容易获得的: Request.FormsForms Validation.Unvalidated(Request) 的属性(property)(静态方法)。并将第三个参数设置为您想要的文化。
    FormValueProviderFactory更直接。
    JsonValueProvider涉及更多 - 基本上你必须复制 JsonValueProviderFactory 的来源到一个新类并修改它 - 因为虽然它允许覆盖 GetValueProvider() , 该方法主要包括调用其他 private static方法。

    编辑(Petar Ivanov):这对我有用。为了使其正常工作,将自定义工厂添加到 ValueProviderFactories.Factories 是不够的。 , 因为这样它是在 FormValueProviderFactory 之后添加的.相反,我不得不替换 FormValueProviderFactory与定制的。

    关于asp.net-mvc-3 - 如何将模型绑定(bind)中使用的所有 ValueProviderResult 的文化设置为给定值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17708344/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com