Tôi có một loại thuộc tính DateTime MyDate
trong ViewModel của mình. Tôi muốn chắc chắn rằng người dùng chỉ nhập ngày tham gia vào một hộp văn bản trong một định dạng cụ thể (dd.mm.yyyy) và thử các thuộc tính sau:Xác thực ngày theo định dạng cụ thể trong ASP.NET MVC 3
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode=true)]
[RegularExpression(@"^(([0-2]\d|[3][0-1])\.([0]\d|[1][0-2])\.[2][0]\d{2})$",
ErrorMessage="Failed...")]
public DateTime MyDate { get; set; }
Chữ ký controller action cho một HttpPost trông giống như này:
[HttpPost]
public ActionResult Edit(int id, MyViewModel viewModel)
{
// MyViewModel contains the MyDate property ...
// ...
if (ModelState.IsValid)
{
// ...
}
// ...
}
Trong giao diện Razor tôi đã cố gắng trong hai cách sau:
@Html.TextBoxFor(model => model.MyDate)
@Html.EditorFor(model => model.MyDate)
Nó không làm việc như tôi muốn. Kết quả là:
- Khách hàng xác nhận phía làm việc như mong đợi với cả những người giúp đỡ Html
- Server side validation luôn thất bại cho cả những người giúp đỡ, thậm chí với số ngày có giá trị như "2011/06/17" mà vượt qua biểu thức chính quy. Thuộc tính
MyDate
được điền chính xác với ngày đã nhập trong sốviewModel
được chuyển cho hành động. Vì vậy, có vẻ như mô hình ràng buộc đã được làm việc. - Thuộc tính
DisplayFormat
chỉ được tôn trọng bởiEditorFor
chứ không phải bởiTextBoxFor
.TextBoxFor
hiển thị "hh dd.mm.yyyy: mm: ss"
Câu hỏi:
Tôi có thể áp dụng một
RegularExpressionAttribute
ở tất cả trên một tài sản mà không phải là mộtstring
? Nếu nó được cho phép như thế nào là reg cũ được đánh giá cho một tài sản không dây nhưDateTime
trên phía máy chủ? Có phải cái gì đó giống nhưMyDate.ToString()
so với chữ reg cũ không? (Nó sẽ giải thích rằng xác nhận thất bại vì ToString sẽ trả về một chuỗi bao gồm việc bán thời gian mà không vượt qua các biểu thức chính quy.)Là
DisplayFormat
thuộc tính thường chỉ được tôn trọng bởiEditorFor
và không bao giờ bằngTextBoxFor
?Tôi làm cách nào để xác thực ngày?
Cảm ơn bạn đã liên kết, tôi đã đánh dấu trang đó để tham khảo trong tương lai. NHƯNG: Tôi không nghĩ rằng vấn đề của tôi có liên quan đến nội địa hoá. Tôi không tin rằng biểu thức chính quy bị bỏ qua: Công việc xác thực phía máy khách và xác thực phía máy chủ cũng thực hiện điều gì đó với reg cũ (nó không thành công với reg cũ này, như ModelState nói). Tôi thử nghiệm trên một máy dev (máy khách và máy chủ = cùng một máy), do đó, các ngôn ngữ là như nhau. Nhưng tôi cũng tin rằng trong khi chờ đợi rằng sử dụng một reg cũ là sai (mặc dù không bị bỏ qua). Làm cách nào để bạn xác thực rằng người dùng chỉ nhập ngày mà không có phần thời gian? – Slauma
@Slauma, thực tế là bạn đã thử điều này trên cùng một máy không có nghĩa là không có sự khác biệt trong cài đặt văn hóa của trình duyệt và máy chủ. Theo như phần thời gian là có liên quan, tôi sẽ chỉ cần nói cho người dùng định dạng mà anh ta cần để nhập ngày vào, và trên máy chủ tôi sẽ đơn giản bỏ qua phần thời gian nếu ứng dụng của tôi không cần nó. Thậm chí có thể cung cấp bộ chọn ngày tháng để đơn giản hóa người dùng nhập ngày vào một định dạng đúng. –
Bạn nói đúng, tôi đang thử nó quá phức tạp. Hiện tại, tôi đã tạo một thuộc tính 'DateOnly' (xem câu trả lời của riêng mình ở đây). Bộ chọn ngày là sự trợ giúp tốt hơn cho người dùng! Tôi sẽ thử nó như một trong những bước tiếp theo. – Slauma