Điều này đang hoạt động, nhưng làm thế nào ???Làm thế nào để asp.net MVC nhớ các giá trị không chính xác của tôi trên postback?
Tôi có một hành động điều khiển cho một bài:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Person person)
{
bool isvalid = ModelState.IsValid;
etc.
Đối tượng Person có một ngày sinh tài sản, loại DateTime. Khi tôi nhập một số dữ liệu không hợp lệ trong biểu mẫu, hãy nói 'blabla' rõ ràng không phải là Ngày giờ hợp lệ, nó sẽ điền tất cả các thuộc tính Person (khác) với dữ liệu chính xác và thuộc tính Ngày sinh với một DateTime trống mới. Giá trị bool isvalid có giá trị 'false'. Cho đến nay rất tốt.
Sau đó, tôi làm điều này:
return View(p);
và trong giao diện i có điều này:
<%= Html.TextBox("BirthDate", String.Format("{0:g}", Model.BirthDate)) %>
<%= Html.ValidationMessage("BirthDate", "*") %>
Ant có nói: Tôi mong các mô hình để chứa các mới, DateTime trống, vì tôi didn Thứ hai, khi View hiển thị một cái gì đó, nó phải là một DateTime, bởi vì Model.BirthDate
không thể giữ bất cứ điều gì ngoài một DateTime. Nhưng với sự ngạc nhiên của tôi, nó cho thấy một hộp văn bản với giá trị 'blabla'! (và màu đỏ * đằng sau nó)
Ngôn ngữ nào là tốt bởi vì người dùng có thể nhìn thấy những gì anh ta gõ sai, nhưng chuỗi (blabla) đó có thể được chuyển đến View trong trường DateTime như thế nào?
EDIT: Thông tin ModelState đã giúp tôi rất nhiều ở đây. Tôi cũng nhận thấy rằng trong MVC 2, khi bạn tạo Mẫu của riêng bạn cho Html.EditorFor() bạn phải tự mình thực hiện hành vi này. Tôi tạo ra một
DateTime.ascx
trong views/chia sẻ thư mục// EditorTemplates, và trong đó tôi đã phải kiểm tra nếu có một lỗi ModelState cho giá trị tài sản này, và nếu như vậy, hiển thị dữ liệu không hợp lệ trong thay vì dữ liệu Mô hình.
Vì vậy, theo quan điểm tôi sử dụng này:
<%= Html.LabelFor(model => model.DateOfBirth) %>
và trong DateTime.ascx tôi sử dụng này:
<%
bool invalidData = false;
string propertyName = ViewData.ModelMetadata.PropertyName;
ModelState ms = ViewData.ModelState[propertyName];
if (ms != null)
{
invalidData = ms.Errors.Count > 0;
}
string valueToshow = invalidData ? ViewData.ModelState[propertyName].Value.AttemptedValue : String.Format("{0:g}", Model);
%>
<input class="text-box single-line" id="<%= propertyName %>" name="<%= propertyName %>" type="text" value="<%= valueToshow %>" />
Cảm ơn, hiện không phải người trợ giúp đã phân tích cú pháp giá trị trong mô hình. – Michel