我有一个小型MVC2应用程序,显示在两种文化中:en-US和es-MX。一部分包含用于预先填充模型中当前日期的日期的用户输入。
使用en-US时,日期字段显示为MM / dd / yyyy,可以使用相同的格式进行更改,而不会导致任何验证错误。
使用es-MX时,日期字段显示为dd / MM / yyyy,但是当以此格式编辑日期时,服务器端验证将失败,并显示以下消息:
值'17 / 05/1991'对日期无效。
有关该消息的第一件事就是它没有本地化。消息本身(我认为我无法控制)和字段的显示名称(我可以控制并在我的代码中本地化)。应该以本地化的格式显示。
我已经尝试单步执行代码以确切了解验证失败的位置,但它似乎发生在我看不到的一些已编译的MVC或DataAnnotations代码中。
应用程序详细信息:IIS6,ASP.NET 3.5(C#),MVC 2 RTM
样本代码:
public class TestVieModel{
[LocalizedDisplayNameDisplayName("TheDateDisplayName", NameResourceType=typeof(Resources.Model.TestViewModel))]
[Required(ErrorMessageResourceName="TheDateValidationMessageRequired", ErrorMessageResourceType=typeof(Resources.Model.TestViewModel))]
[DataType(DataType.Date)]
public DateTime TheDate { get; set; }
}
示例控制器操作代码:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Save(TestViewModel model) {
if(ModelState.IsValid) { // <--- Always is false when using es-MX and a date foramtted as dd/MM/yyyy.
// Do other stuff
return this.View("Complete", model);
}
// Validation failed, redisplay the form.
return this.View("Enter", model);
}
示例查看代码:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<HispanicSweeps.Web.Model.LosMets.EnterViewModel>" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Test</title>
</head>
<body>
<% using (Html.BeginForm()) {%>
<%= Html.ValidationSummary(true) %>
<fieldset>
<legend>Fields</legend>
<div class="editor-label">
<%= Html.LabelFor(model => model.TheDate) %>
</div>
<div class="editor-field">
<%= Html.EditorFor(model => model.TheDate) %>
<%= Html.ValidationMessageFor(model => model.TheDate) %>
</div>
<p><input type="submit" value="Save" /></p>
</fieldset>
<% } %>
</body>
</html>
答案 0 :(得分:2)
以下是我在案例中解决问题的方法。我手动验证了控制器中的日期并重置了该属性的ModelState:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Save(TestViewModel model) {
var tempDate = new DateTime();
var culture = CultureInfo.CurrentUICulture;
if(DateTime.TryParse(Request.Form["TheDate"], culture, DateTimeStyles.None, out tempDate)) {
model.DateOfBirth = tempDate;
ModelState.Remove("TheDate");
}
if(ModelState.IsValid) { // <--- Now valid
// Do other stuff
return this.View("Complete", model);
}
// Validation failed, redisplay the form.
return this.View("Enter", model);
}
答案 1 :(得分:1)
验证发生在DataAnnotations类中。您可以为自己的目的子类化DataAnnotations类。
我会创建一个新的MultiCultureDateType
DataAnnotations类,用于验证多种文化中的日期。
更多信息:http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx