我在回发验证期间在Datetime属性上使用DisplayFormat属性时遇到问题。
要明确这不是一个主要问题,但我想了解一种方法,使其无需“黑客”工作或只是讨论这一点(在这是'正常'行为的情况下)。
让我们承认我在DB中有一些日期时间(例如10/17/2014 12:00:00 AM)以表格形式显示。我正在使用DataType(Datatype.Date)
和DisplayFormat(...)
属性,但当我回发我的表单时,由于Datetime格式,我使ModelState无效。
namespace Package.To.Models {
public class MyModel
{
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0: dd/MM/yyyy}", ApplyFormatInEditMode = true]
public Datetime myDate { get; set; }
...other properties
}
}
@model Package.To.Models.MyModel
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<div class="editor-label">
@Html.LabelFor(model => model.myDate)
</div>
<div class="editor-field">
<!-- displayed with the good format eg. 17/10/2014 -->
@Html.EditorFor(model => model.myDate)
</div>
<input type="submit" value="Ok" class="button"/>
</fieldset>
}
[HttpPost]
public ActionResult calledWhenSubmit(MyModel model)
{
// invalid model.myDate: 1/1/0001 12:00:00 AM
var errors = ModelState
.Where(x => x.Value.Errors.Count > 0)
.Select(x => new { x.Key, x.Value.Errors })
.ToArray();
// errors.Errors[0].ErrorMessage: "The value '17/10/2014' is not valid for myDate"
// errors.Errors[0].Exception._COMPlusExceptionCode: -532462766
if (ModelState.IsValid) // returning false
{
...some code
}
return View();
}
看来,如果我删除DisplayFormat(...)
属性,一切正常(除了表格中显示的日期格式错误)。
我在SO上发现了很多关于Datetime和ModelState问题的帖子,但是在配置中没有任何内容就像我得到的那样,所以我全神贯注于我所缺少的内容
答案 0 :(得分:0)
我遇到了同样的问题。虽然您设置了DateFormatString
但控制器验证不理解此格式,但它理解文化格式。您需要通过添加以下代码在Startup.cs
ConfigureServices方法中更改它:
var cultureInfo = new CultureInfo("en-US");
CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;