2017-09-19 24 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 
} 
相關問題