2017-09-19 23 views
-1

在我的测试应用程序,我有一个日期时间字段定义为这样:日期时间接受超过4个位数的年

[Required(ErrorMessage = "This is required")] 
[Display(Name = "test date:")] 
[DataType(DataType.Date)]   
[DisplayFormat(DataFormatString = "{0:dd/MMMM/yyyy}", ApplyFormatInEditMode = true)] 
public DateTime? date1 { get; set; } 

在我看来:

@Html.EditorFor(
    model => model.date1, 
    new { 
     htmlAttributes = new { 
      @Value = Model.date1 != null ? Model.date1.Value.ToString("yyyy-MM-dd") : "" 
     } 
    }) 
@Html.ValidationMessageFor(model => model.date1, "", new { @class = "text-danger" }) 

一切工作正常,但是当我进入像10/03/19999(dd,MM,yyyyy)这样的日期,应用程序中断,显然我输入的日期是错误的,但我不知道如何处理错误。我试过使用datetime.tryparse来回传失败,但后来我失去了填充表单的内容。

更新:

继quadzz的解决方案,我已经试过:

[Required(ErrorMessage = "This is required")] 
[Display(Name = "test date:")] 
[DataType(DataType.Date)] 
[Range(typeof(DateTime), "1/1/1900", "31/12/2000", ErrorMessage = "Value for {0} must be between {1} and {2}")] 
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 

,但它仍然无法正常工作。

+0

为什么它错了?确定它将会是一个很长的时间,然后才能达到10000但是有一天.. – BugFinder

+1

定义“应用程序中断” – Charleh

+0

“DateTime”支持年份最高达到9999。如果年份多于此值,则认为溢出(并且可能会抛出例外)。你可以创建一个类似'DateTime'的自定义结构,其中包含5位'Year'属性,但似乎需要在结构中声明几个'DateTime'方法。 –

回答

2

尝试测量您的日期时间字段。 参考这里:https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.rangeattribute.aspx

例子:

[Range(typeof(DateTime), "1/1/2000", "1/1/2010", 
     ErrorMessage = "Value for {0} must be between {1:d} and {2:d}")] 
    [DataType(DataType.Date)] 
+0

我试过这个解决方案,但它不起作用?我已经更新了我的答案 – rem

+0

这是错误的,'[Range]'属性甚至不适用于客户端的日期 –

0

一对夫妇的解决方案:

添加客户端验证,以检查日期将其发送到服务器之前(当然使服务器验证你现在也做)。这样做可以将问题简化为几乎无关紧要的情况(那些没有启用javascript并输入错误日期的用户)。

或者另一种解决方案:

您的日期1字段更改为字符串。如果日期不正确,请将原始值发送回您的页面。

DateTime date; 

if (DateTime.TryParse(date1, out temp))  
{ 
    //The date is fine, save it. 
} 
else 
{ 
    ModelState.AddError("date1", "Incorrect date: " + date1); 
} 

然后在您的编辑器中,您只需显示一个普通的文本字段,不需要进行转换。

1

在将数据发送到服务器之前执行客户端验证。虽然服务器端验证,还需要您的情况可以通过客户端验证来处理这样做,包括以下布局文件

  1. jQuery的
  2. jquery.validate
  3. jquery.validate.unobtrusive js文件

那么您认为应该像

@Html.EditorFor(
    model => model.date1, 
    new { 
     htmlAttributes = new { 
      @Value = Model.date1 != null ? Model.date1.Value.ToString("yyyy-MM-dd") : "", 
      @Readonly="readonly" 
     } 
    }) 
@Html.ValidationMessageFor(model => model.date1, "", new { @class = "text-danger" }) 

我已经重新编辑adonly以便用户从datepicker库中选择日期(虽然可以轻松绕过)[虽然可以轻松绕过]

如果通过客户端验证或客户端通过禁用javascript提交数据,您需要执行服务器端验证在控制器中通过检查来完成ModelState

[HttpPost] 
public ActionResult Employee(EmployeeModel employee) 
{ 
    if(ModelState.IsValid) 
    { 
    //Everything is good to process 
    } 
    return View(employee);//returns view with model error if any 
} 
相关问题