6

Tôi đã tìm thấy rất nhiều câu hỏi về simulair nhưng không phải là giải pháp làm sạch tốt đang hoạt động. Tôi thấy rất nhiều mã tùy chỉnh để làm việc này nhưng tại sao vậy? Nếu điều này không làm việc ngay từ đầu?Xác thực ngày giờ MVC không thành công

Những gì tôi nghĩ là lạ, là trong IE9 nó hoạt động nhưng trong Firefox và Chrome nó là không. Mỗi khi im trong Firefox hoặc Chrome, tôi nhận được thông báo "Trường ngày sinh phải là ngày".

Khi tôi thử mã bên dưới trong dự án MVC 4 RTM mới, tôi không thể làm cho nó hoạt động. Tôi thấy mặc định DateTime.Now là dd-MM-yyyy (Hà Lan) trong tất cả các trình duyệt nhưng tôi không thể gửi nó trong Firefox và Chrome.

Thẻ toàn cầu hóa không được đặt trong web.config do đó thẻ phải được sử dụng mặc định. Im từ Hà Lan vì vậy nó sẽ nhận được văn hóa khách hàng tôi đoán.

public class RegisterModel 
{ 
    [Required] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 

    [Required] 
    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] 
    //[DataType(DataType.Date)] 
    public DateTime Birthday { get; set; } 
} 

[AllowAnonymous] 
    public ActionResult Register() 
    { 
     RegisterModel vm = new RegisterModel() 
     { 
      Birthday = DateTime.Now 
     }; 
     return View(vm); 
    } 

    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult Register(RegisterModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      // Attempt to register the user 
      try 
      { 
       //WebSecurity.CreateUserAndAccount(model.UserName, model.Password); 
       //WebSecurity.Login(model.UserName, model.Password); 
       return RedirectToAction("Index", "Home"); 
      } 
      catch (MembershipCreateUserException e) 
      { 
       ModelState.AddModelError("", ErrorCodeToString(e.StatusCode)); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

Markup

<!-- language: lang-none --> 
@model DateTimeWithDatePicker.Models.RegisterModel 
@{ 
    ViewBag.Title = "Register"; 
} 

<hgroup class="title"> 
    <h1>@ViewBag.Title.</h1> 
    <h2>Create a new account.</h2> 
</hgroup> 

@using (Html.BeginForm()) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary() 

    <fieldset> 
     <legend>Registration Form</legend> 
     <ol> 
      <li> 
       @Html.LabelFor(m => m.UserName) 
       @Html.TextBoxFor(m => m.UserName) 
      </li> 
      <li> 
       @Html.LabelFor(m => m.Birthday) 
       @Html.EditorFor(m => m.Birthday) 
      </li> 
     </ol> 
     <input type="submit" value="Register" /> 
    </fieldset> 
} 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 
+0

Xin lỗi nhưng tôi không biết làm thế nào để định dạng MVC Xem ở trên. –

Trả lời

3

Vấn đề là xác nhận jQuery và nội địa hóa . Dường như có các tệp bản địa hóa cho các thông điệp và các phương thức của plugin jQuery. Xem blog của tôi để biết chi tiết giải thích vấn đề và cách tôi giải quyết nó.

http://www.locktar.nl/programming/mvc/localization-validation-in-mvc/

Edit: tôi vừa phát hành một bài đăng blog mới với một refresh của tất cả các vấn đề nội địa hóa và làm thế nào để sửa chữa nó cho một tài sản DateTime. Xem bài đăng mới của tôi MVC localization validation.

+0

Tôi đã sử dụng http://ajax.aspnetcdn.com/ajax/jquery.validate/1.7/localization/methods_nl.js, tôi tìm thấy sau liên kết của bạn. Điều này làm việc tốt trong IE và Firefox, nhưng không hoạt động trong Chrome. Chrome hỗ trợ nhập ngày tháng html5 và lưu trữ giá trị theo định dạng "yyyy-mm-dd". Tôi đã thay đổi thử nghiệm thành: if (Modernizr.inputtypes.date) { trả về true; } else {} –

+0

Bạn đã thay đổi 1.7 thành phiên bản mới nhất chưa? Nó nó một thời gian trước đây tôi đã viết blog đó. Tôi vừa mới khởi chạy trang blog mới của tôi tại www.locktar.nl. –

1

Thẻ toàn cầu hóa không được thiết lập trong web.config vì vậy nó phải được sử dụng mặc định . Im từ Hà Lan vì vậy nó sẽ nhận được văn hóa khách hàng tôi đoán.

Không, điều đó không chính xác. Bạn có thể hoàn toàn tốt đẹp từ Hà Lan và đã cấu hình trình duyệt của bạn để sử dụng văn hóa Trung Quốc. Lý do bạn không thể làm điều này để làm việc có lẽ là vì trong FF và Chrome bạn không có văn hóa chính xác.

Vì bạn chưa chỉ định một nền văn hóa trong phần tử toàn cầu hóa của mình trong web.config, ASP.NET MVC sẽ sử dụng phần tử được gửi từ trình duyệt trong tiêu đề yêu cầu. Ví dụ, nếu bạn cấu hình trình duyệt của bạn cho en-US văn hóa tiêu đề sau đây sẽ được thiết lập dọc theo mỗi yêu cầu:

Accept-Language:en-US,en;q=0.8 

Dưới đây là cách này được cấu hình trong Chrome:

enter image description here

Vì vậy, hãy chắc chắn rằng bạn đã đặt ngôn ngữ mong muốn của bạn lên đầu tiên trong danh sách.

Và nếu bạn muốn một cách đáng tin cậy để sử dụng cú pháp giống như một định nghĩa trong thuộc tính DisplayFormat bạn trong thời gian ràng buộc bạn có thể viết một mô hình tùy chỉnh chất kết dính mô hình như ở đây: https://stackoverflow.com/a/7836093/29407

+0

Văn hóa của tôi rất tốt trong firefox và chrome nên đó không phải là vấn đề. Vấn đề là xác thực jQuery không hoạt động trong Firefox và Chrome giống như trong Internet Explorer. Xem câu trả lời của bài đăng này và blog của tôi đi vào chi tiết. –

7

tôi đã có thể khắc phục điều này bằng cách sửa đổi chức năng validator jQuery cho những ngày:

<script type="text/javascript"> 

    $(function() { 

    var dateFormat="dd/mm/yy"; // en-gb date format, substitute your own 

    $("#Birthday").datepicker({ 
     "dateFormat": dateFormat 
    }); 

    jQuery.validator.addMethod(
     'date', 
     function (value, element, params) { 
      if (this.optional(element)) { 
       return true; 
      }; 
      var result = false; 
      try { 
       $.datepicker.parseDate(dateFormat, value); 
       result = true; 
      } catch (err) { 
       result = false; 
      } 
      return result; 
     }, 
     '' 
    ); 

}); 

+0

Xem câu trả lời của tôi về chủ đề của riêng tôi. Tôi đã viết một blogpost về nó http://stackoverflow.com/a/12346915/801005 –

+1

Tôi đã thử bài đăng trên blog của bạn khi cố giải quyết vấn đề này. Tôi chắc chắn rằng đó là giải pháp tốt nhất khi bạn muốn có một giải pháp kết luận cho nhiều người dùng ở các quốc gia khác nhau. Nhưng kịch bản trên phù hợp khi bạn cần một giải pháp hai phút và bạn không quan tâm đến việc bản địa hóa cho cơ sở người dùng đa quốc gia. – gls123