加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – 如何将模型绑定中使用的所有ValueProviderResu

发布时间:2020-12-16 03:53:37 所属栏目:asp.Net 来源:网络整理
导读:事实证明,MVC的DefaultModelBinder使用不同的文化来解析POST与GET请求的值(例如double,DateTime等). Here是更多信息. 我看到这是由ValueProviderResult对象的Culture属性控制的,它们是从IValueProvider.GetValue()返回的. 我的问题是:如何全局确保此值始终
事实证明,MVC的DefaultModelBinder使用不同的文化来解析POST与GET请求的值(例如double,DateTime等).
Here是更多信息.

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

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

我知道我可以实现自定义值提供程序并以这种方式执行.

我知道我可以实现自定义模型绑定器并以这种方式执行.

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

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

解决方法

据我所知,没有办法符合你的标准.你将不得不做你知道可以做的事情之一(我说最合适的方式是自定义价值提供者).

原因:所有默认的ValueProviders都是硬编码的,可以使用CultureInfo.InvariantCulture或CultureInfo.CurrentCulture.

具体来说,就是FormValueProvider的做法:

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

不从其他任何地方检索文化(即,上面的论证不是默认使用,而是作为一种文化使用).

不同的IValueProviders的文化

作为参考,这些是每个默认IValueProviders的文化:

> ChildActionValueProvider:InvariantCulture
> FormValueProvider:CurrentCulture
> JsonValueProvider:CurrentCulture
> RouteDataValueProvider:InvariantCulture
> QueryStringValueProvider:InvariantCulture
> HttpFileCollectionValueProvider:InvariantCulture

替换CurrentCulture IValueProviders

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

FormValueProvider的原始实现在表面上看起来比实际更难,引用了内部类和接口.但是为了取代提供者而不需要它们 – 它们仅用于单元测试.

您只需要调用基本构造函数(如上所述),传递两个易于获取的NameValueCollections:Request.Forms和Validation.Unvalidated(Request)的Forms属性(静态方法).并将第三个参数设置为您想要的文化.

FormValueProviderFactory更加简单明了.

JsonValueProvider有点复杂 – 基本上你必须将JsonValueProviderFactory的源代码复制到一个新类并修改它 – 因为虽然它允许重写GetValueProvider(),但该方法主要包括对其他私有静态方法的调用.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读