0

我花了几个小时阅读了很多文章,但我仍然无法解决我的问题。

我的模型中有一个DateTime类型属性:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public System.DateTime StartTime { get; set; }

我已将格式设置为dd/MM/yyyy,因此我希望接受像 14/12/2014 这样的日期。但是,验证总是失败并显示以下消息:The field StartTime must be a date.我尝试输入 12/14/2014 并且没关系。

在阅读了几篇文章之后,我尝试用剃刀代码编辑格式,例如:

@Html.TextBoxFor(model => model.StartTime, "{0:dd/MM/yyyy}")

并尝试像 ataravati 在下面的答案中所说的那样使用 EditorFor:

@Html.EditorFor(model => model.StartTime)

或者,将文化更改为web.config日在月之前的文化,例如 GB:

<system.web>
    <globalization uiCulture="en" culture="en-GB"/>  
</system.web>

但是,它们都不适合我。

我尝试仅使用文本输入并手动输入日期(不使用 jqueryUI 之类的任何控件)。但是,如果它是 dd/MM/yyyy 格式,验证仍然不接受我的手动输入。谁能告诉我这个问题或告诉我找出问题所在的方法?

更新:对于可能和我有同样问题的人。

在斯蒂芬下面提到的帖子之后,我们必须创建一个“日期”验证来覆盖默认的注释验证。我们创建的自定义验证将允许我们想要的格式。

但是,在那之后,发布到控制器的数据可能不包含该数据(在我的情况下,所有日期时间值都设置为默认日期时间)。原因是文化设置不接受您的格式。我们可以更改 web.config 中的文化设置,但我认为这不是最好的方法,因为它会影响您项目中的其他值类型(货币、数字....)。以我的方式,我创建了一个自定义 ModelBinder,用于以正确的格式绑定 Datetime(此处的示例:http: //www.codeproject.com/Articles/605595/ASP-NET-MVC-Custom-Model-Binder)。

上面的解决方案看起来很复杂。它不应该只是为了通过验证,但到目前为止,我没有找到更好的东西。因此,如果有人有更好的解决方案,让注释验证正确验证日期时间值的格式,请分享。

4

2 回答 2

1

ApplyFormatInEditMode选项仅在您使用时有效@Html.EditorFor,而不是@Html.TextBoxFor。将您的剃须刀代码更改为:

@Html.EditorFor(model => model.StartTime)
于 2014-12-12T20:56:10.967 回答
0

实际上,对我来说救命的一件事如下,您不需要任何数据注释(除非您想要它们等):

@Html.TextBoxFor(m => m.StartDate, new { @Value = Model.StartDate.ToString("dd-MMM-yyyy") })

上述格式当然可以更改为任何格式。

当然,一个流行的做法是添加一个日期选择器。我正在使用 jQuery UI datepicker 以方便使用:

@Html.TextBoxFor(model => model.StartDate, new { @Value = Model.StartDate.ToString("dd-MMM-yyyy"), @class = "form-control datepicker" })

为了完整起见,我的视图模型类示例如下所示:

[DisplayName("Start Date")]
[Required(ErrorMessage = "An start date must be supplied")]
public DateTime StartDate { get; set; }

希望能帮助到你。

于 2014-12-23T13:30:50.243 回答