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)
这是正确的 MVC 行为。
GET 请求利用查询字符串将数据发送到服务器,而 POST 则利用请求正文。
由于 URL(包括查询字符串)通常由应用程序开发人员“拥有”,因此 MVC 使用不变区域性将原始字符串值解析为模型上的对象。解析总是在语言环境的上下文中发生,因此您必须了解将使用哪个本地环境。
对此最简单的解决方法是在使用 GET 时以固定格式输入日期,或者使用 POST,然后使用 IIS 线程的区域性或用户接受语言标头,具体取决于您站点的配置。
最后,您可以自己实现 IModelBinder 或扩展 DefaultModelBinder 并更改此行为。
我还将为Glimpse插入一个插件,它将向您展示在模型绑定的每个属性/参数上使用的文化。