DateTime接受年份超过4位数

时间:2017-09-19 09:28:25

标签: c# datetime asp.net-mvc-5

在我的测试应用程序中,我有一个datetime字段定义如下:

[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)]

但它仍然不起作用。

3 个答案:

答案 0 :(得分: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)]

答案 1 :(得分:1)

在将数据发送到服务器之前执行客户端验证。虽然还需要服务器端验证,但客户端验证可以处理您的场景,以便在布局文件中包含以下js文件

  1. jquery
  2. jquery.validate
  3. jquery.validate.unobtrusive
  4. 所以你的观点应该像

    @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" })
    

    我已经使编辑器只读,以便用户从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
    }
    

答案 2 :(得分:0)

一些解决方案:

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

或另一种解决方案:

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

DateTime date;

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

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