C# ASP.NET MVC日期时间值在发布失败后未保存
我有一个表格,需要输入两个日期。一个接一个。我已经设置了一个自定义验证器来处理这个问题。如果以后的日期无效,验证程序将触发并显示预期的错误消息。如果随后将该日期更正为有效日期,则会将其作为“01/01/0001”发布到服务器。更正的日期无法发送到服务器 型号:C# ASP.NET MVC日期时间值在发布失败后未保存,c#,html,asp.net-mvc,post,asp.net-mvc-5.2,C#,Html,Asp.net Mvc,Post,Asp.net Mvc 5.2,我有一个表格,需要输入两个日期。一个接一个。我已经设置了一个自定义验证器来处理这个问题。如果以后的日期无效,验证程序将触发并显示预期的错误消息。如果随后将该日期更正为有效日期,则会将其作为“01/01/0001”发布到服务器。更正的日期无法发送到服务器 型号: [Display(Name = "Start")] public DateTime Start { get; set; } [Display(Name = "End")] [CustomTimeRangeEnd(ErrorMessage
[Display(Name = "Start")]
public DateTime Start { get; set; }
[Display(Name = "End")]
[CustomTimeRangeEnd(ErrorMessage = "End Date is required and must be a valid date after Start Date")]
public DateTime End { get; set; }
验证器:
public class CustomTimeRangeEndAttribute : ModelAwareValidationAttribute
{
static CustomTimeRangeEndAttribute()
{
Register.Attribute(typeof(CustomTimeRangeEndAttribute));
}
public override bool IsValid(object value, object container)
{
var model = (ICustomTimeRange)container;
if (value == null) return false;
DateTime dt;
var validdt = DateTime.TryParse(value.ToString(), out dt);
if (!validdt) return false;
if (dt < model.Start) return false;
return true;
}
public类CustomTimeRangeEndAttribute:ModelAwareValidationAttribute
{
静态CustomTimeRangeEndAttribute()
{
属性(typeof(CustomTimeRangeEndAttribute));
}
公共覆盖布尔值有效(对象值,对象容器)
{
var模型=(ICustomTimeRange)容器;
if(value==null)返回false;
日期时间dt;
var validdt=DateTime.TryParse(value.ToString(),out dt);
如果(!validdt)返回false;
如果(dt
视图:
@Html.LabelFor(x=>x.Start,新的{@class=“control label”})
@Html.LabelFor(x=>x.End,新的{@class=“control label”})
正如@TanvirArjel所说,如果发布为“01.01.0001”,您的视图中会出现问题。如果您使用的是日期选择器,请检查其时间格式,您可以将其添加到代码中
dateformat:'dd-mm-yy'
提供它,就像
$('#end').datepicker({
dateformat:'dd-mm-yy'
});
为了澄清,这两个日期都会在首次发布时发送到服务器?当出现验证错误时,HTML日期输入的名称或id属性是否会更改?是的,这两个日期都会在首次发布时发送到服务器。如果出现错误,名称和id属性不会更改。@RossD
会作为“01/01/0001”发送到服务器.
-这意味着您的值没有从视图传递到控制器。最好提供控制器操作和ICustomTimeRange
定义,因为仍然缺少一些重现问题的重要信息。据我所知,默认情况下输入的日期
格式为yyyy-MM-dd
格式,但您正在声明dd/M改为年月日
或年月日。
$('#end').datepicker({
dateformat:'dd-mm-yy'
});