MVC3:在GET请求中没有为ModelState设置文化?

时间:2011-10-07 11:31:02

标签: c# asp.net-mvc-3 validation

我有一个最简单的模型,我想验证一个Date字段。 问题是,如果我输入日期为dd.mm.yyyy并通过GET提交,则表示未通过验证。如果我通过POST提交,一切都还可以。

我已明确将CultureInfo设置为适合我项目的值。 我注意到,如果GET ModelState.Values.ToList()[0].Value.Culture是InvariantCulture,并且在POST的情况下它是我的ru-RU。

为什么没有为GET请求设置文化?这是ASP.Net的正确行为吗?有解决方法吗?

仅供参考或有人想检查,这是模型:

    public class TestModel
    {
        [Required]
        [DataType(DataType.Date)]
        public DateTime Date { get; set; }
    }

观点:

@using (Html.BeginForm("Index2", "Home", FormMethod.Get)) @* if that is changed to FormMethod.Post - everything's ok *@
{
    @Html.ValidationSummary(true)
    @Html.EditorForModel()
    <input type="submit" value="Ok" />
}

处理程序:

    public ActionResult Index2(TestModel model)
    {
        if (!ModelState.IsValid)
        {
            return View("Index", model);
        }

        return Content("Ok");
    }

2 个答案:

答案 0 :(得分:4)

这是适当的MVC行为。

GET请求利用查询字符串将数据发送到服务器,而POST利用请求体。

由于URL(包括查询字符串)通常由应用程序开发人员“拥有”,因此MVC使用不变文化将原始字符串值解析为模型中的对象。解析总是发生在语言环境的上下文中,因此您必须了解将使用哪个本地。

最简单的解决方法是在使用GET时以不变格式输入日期,或者使用POST然后使用IIS线程的文化,或者根据您站点的配置使用Accept-Language标头。< / p>

最后,您可以自己实现IModelBinder或扩展DefaultModelBinder并更改此行为。

我还会为Glimpse添加一个插件,它会显示在模型绑定的每个属性/参数上使用的文化。

答案 1 :(得分:2)

  

为什么没有为GET请求设置文化?

这是设计的。 GET请求期望使用InvariantCulture格式化日期时间。解决方法是编写自定义模型绑定器。