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

Sha*_*dix 2 c# validation asp.net-mvc-3

我有一个最简单的模型,其中包含一个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; }
    }
Run Code Online (Sandbox Code Playgroud)

风景:

@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" />
}
Run Code Online (Sandbox Code Playgroud)

和处理程序:

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

        return Content("Ok");
    }
Run Code Online (Sandbox Code Playgroud)

nik*_*d23 5

这是正确的 MVC 行为。

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

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

对此最简单的解决方法是在使用 GET 时以固定格式输入日期,或者使用 POST,然后使用 IIS 线程的区域性或用户接受语言标头,具体取决于您站点的配置。

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

我还将为Glimpse插入一个插件,它将向您展示在模型绑定的每个属性/参数上使用的文化。