【问题标题】:MVC3 globalization not set for ModelState.Value.Culture未为 ModelState.Value.Culture 设置 MVC3 全球化
【发布时间】:2011-07-08 19:23:35
【问题描述】:

我已将 Action Filer 中的文化设置为

Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);

其中文化 = {fr-be} =>法国比利时。

仅供参考,此操作过滤器设置用户选择的文化。

其中一个 myAction 用户正在输入格式为 [dd/mm/yyyy] => 26/7/2011 的日期。 动作如下

    public ActionResult RequestVacation(VacationRequest model)
    {
        if(ModelState.IsValid)
        {

....

当我调试代码时 model.VacationDate 包含 01/01/0001 ;虽然应该是 2011 年 7 月 26 日 而 Form[VacationDate] 包含 26/07/2011 [这是 Fr-BE 甲酸盐] 而 ModelState.IsValid 为假;虽然它应该是真的,因为日期在 fr-be 格式中是正确的。 当我进一步挖掘但在视觉工作室检查当地人时 我找到了

this.ModelState[1].Culture = {en-US}

而我已经使用 actionFilter 设置了文化值,如上所述。 我的问题是如何设置 this.ModelState.Culture = {fr-be}?

【问题讨论】:

  • "当我调试代码模型时。VacationDate 包含 01/01/1900 ;虽然它应该是 7/26/2011" - 1900 年 1 月 1 日是 SQL Server 中的最小日期。虽然您没有提到您正在使用某种数据库,但似乎这个问题与 CultureInfo 无关。我会先尝试修复它,然后继续修复其他问题...
  • 你猜对了,db 是 SQL Server。请考虑这条线。 “Form[VacationDate] 包含 26/07/2011 [这是 Fr-BE 甲酸盐] 而 ModelState.IsValid 是假的;虽然它应该是真的”。所以这里的问题是 requestSring 中存在日期,而在验证时,它没有被解析。

标签: asp.net-mvc validation globalization


【解决方案1】:

回答您的问题有点晚了,但我想发生的事情是您正在操作过滤器的 OnActionExecuting 方法中设置当前线程文化,但模型绑定在此之前发生,因此它不会接受您的更改.

您需要在模型绑定发生之前(例如在 Application BeginRequest 方法或 AcquireRequestState 中(如果您需要将文化存储在会话中)移动将设置文化的代码在管道中更早的位置。

【讨论】:

  • 你完全正确。我在基本控制器 OnActionExecuting 上设置文化。尽管它在动作执行之前执行,但它显然是在 ModelState 被实例化之后才执行的。谢谢
【解决方案2】:

将以下内容放入您的 web.config:

<configuration>
   <system.web>
      <globalization
           fileEncoding="utf-8"
           requestEncoding="utf-8"
           responseEncoding="utf-8"
           culture="fr-BE"
           uiCulture="fr-BE"
        />
   </system.web>
</configuration>

【讨论】:

  • 这是一种强制服务器设置另一种文化的解决方案
【解决方案3】:

针对我的上述问题,我以这种方式解决了它

            if (ModelState.Keys.Contains("VactionDate"))
        {
            ModelState err = ModelState["VactionDate"];
            if (!err.Value.Culture.Equals(Thread.CurrentThread.CurrentCulture))
            {
                try
                {
                    DateTime dt = Convert.ToDateTime(err.Value.AttemptedValue, Thread.CurrentThread.CurrentCulture.DateTimeFormat);
                    model.VactionDate = dt;
                    ModelState.Remove("VactionDate");
                }
                catch
                {
                }
            }
        }

我知道这不是一个好的解决方案。但我仍在寻找在验证发生之前进行更改的方法,

ModelState[n].Value.Culture = {en-US}

ModelState[n].Value.Culture = {fr-BE}

其中 {fr-BE} 是我需要的文化,用于解析 dateTime。 所以我还在找人来解决这个问题。

【讨论】:

  • 虽然我不想改变文化,但我已经使用了这个解决方案。干得好!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多