6

Tôi thấy có một số câu hỏi tương tự về vấn đề này, nhưng không giải quyết được vấn đề của tôi.Xác thực MVC3 với ComponentModel.DataAnnotations cho định dạng ngày Vương quốc Anh (cũng sử dụng jquery ui datepicker)

Tôi đang làm việc trên ứng dụng MVC3 với Entity Framework 4.3. Tôi có một trường ngày ở Vương quốc Anh mà tôi dự định cho phép người dùng chỉnh sửa bằng cách sử dụng trình đếm date UI Jquery (mà tôi đã làm việc nhờ có this blog).

May mắn thay cho tôi blog này bao gồm các hướng dẫn về cách đặt datepicker theo định dạng UK, tuy nhiên, việc xác thực EF vẫn cho tôi biết rằng tôi cần nhập định dạng ngày hợp lệ. Wierdly nó không ngăn cản tôi gửi ngày đến DB của nó chỉ là xác nhận không phô trương đá vào và hiển thị thông báo.

Tại thời điểm tôi có chú thích dữ liệu sau:

[DataType(DataType.Date)] 
public System.DateTime Module_Date { get; set; } 

nhưng tôi cũng đã cố gắng nói thêm:

[DisplayFormat(DataFormatString="{0:dd/MM/yyyy}")] 

mà không ảnh hưởng gì cả. Tôi hy vọng một số có một giải pháp bởi vì tôi không ưa thích tắt xác nhận không phô trương để ngăn chặn thông báo lỗi này.

Cảm ơn

EDIT

sau câu trả lời @Iridio, tôi nhìn vào thêm một mô hình Ràng buộc, và thực sự từ vài bài viết như thế này mà tôi đọc nó dường như là điều phải làm , nhưng những gì tôi đã đưa ra không có hiệu lực. đây là những gì tôi đã cố gắng:

public class DateTimeBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     var date = value.ConvertTo(typeof(DateTime), CultureInfo.CurrentCulture); 

     return date; 
    } 
} 

với điều này trong phương pháp Application_Start() của tập tin Global.asax.cs:

ModelBinders.Binders.Add(typeof(DateTime), new DateTimeBinder()); 
ModelBinders.Binders.Add(typeof(DateTime?), new DateTimeBinder()); 
+0

Tôi tin rằng bạn đề cập đến System.ComponentModel.DataAnnotations thay vì chú thích dữ liệu EntityFramework? Nếu bạn theo dõi blog thông qua thì bạn có chỉ định định dạng dữ liệu '{dateFormat:" dd/mm/yy "}' trong tập lệnh phía máy khách của bạn không? Nếu vậy, bạn đang sử dụng phiên bản script jquery ui nào? – Dangerous

+0

oooh bạn khá chính xác tôi đang sử dụng các ComponentModel. Tôi đã quen với việc sử dụng EF trong dự án cuối cùng. sẽ nâng cấp. Tôi đã sử dụng jquery ui 1.8.7 nhưng tôi đã cập nhật lên phiên bản mới nhất theo câu trả lời của bạn bên dưới để không có kết quả như sau: – Ben

+0

oh và yes tôi đã chỉ định '{dateFormat:" dd/mm/yyyy "}' – Ben

Trả lời

4

Phải, vấn đề là với các tập lệnh xác thực jquery khăng khăng sử dụng datefomat của Hoa Kỳ. Tôi sẽ kiềm chế bản thân của tôi từ đi trên một rant thích hợp về thực tế là phần lớn thế giới sử dụng dd/mm/yyyy mặc dù.

Dù sao, cuối cùng tôi tìm thấy câu trả lời cho tai ương của tôi trong nhận xét cho câu trả lời của một số question tương tự, tác giả đã viết một số blog post về cách giải quyết vấn đề.

Về cơ bản tôi đã sử dụng số jquery globalize script và chỉ đặt văn hóa là en-GB. Tôi nên đề cập đến rằng trong blog của mình, ông không đề cập đến nơi để đặt các bit mà bạn chỉ định các nền văn hóa, vì vậy tôi chỉ đẩy vào trong thẻ script trong trang dưới tham chiếu đến các kịch bản toàn cầu hóa:

<script src="@Url.Content("~/Scripts/globalize.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/globalize.culture.en-GB.js")" type="text/javascript"></script> 
<script type="text/javascript"> 
    Globalize.culture("en-GB"); 
    $.validator.methods.date = function (value, element) { 
     return this.optional(element) || Globalize.parseDate(value); 
    }; 
</script> 
+0

Nó thực sự không cần thiết để đi đến tất cả những rắc rối này chỉ để làm cho ngày Vương quốc Anh xác nhận !! Nhưng cảm ơn vì thông tin tôi đã bị mắc kẹt trên này. Chỉ cần hy vọng jQuery thêm một cách thanh lịch hơn để làm điều này sớm. Tập lệnh globalize.js (trớ trêu thay chính tả với một z :)) là khá lớn. –

+0

@PaulJohnson Tôi đồng ý, tôi không cần phải làm điều đó, và giải quyết nó không phải là một giải pháp rất tốt cho rất nhiều trường hợp vì nó luôn luôn ép buộc ngày định dạng Anh. – Ben

+0

Tôi đã tìm kiếm hai ngày để giải quyết vấn đề này, với ngón tay cuối cùng trỏ đến JQuery vì những lý do bạn đề cập đến. Sửa lỗi này đã làm việc hoàn hảo cho tôi - mặc dù cách dễ nhất để thực hiện nó là sử dụng nuget để thêm gói jquery-globalize - và nếu bạn làm điều đó, thì các vị trí kịch bản sẽ trở thành /Scripts/globalize/globalize.js và/Scripts/globalize/culture/globalize.culture.en-GB.js –

1

Bạn phải viết bạn sở hữu ModelBinder cho kiểu DateTime.

Đây là một chất kết dính mà tôi đã viết cho một câu hỏi tương tự nhưng với kiểu thập phân (có thể bạn sẽ cần đến nó). bạn nên nắm bắt ý tưởng và thích ứng với nó để nhu cầu của bạn

public class DecimalModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
    ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
    ModelState modelState = new ModelState { Value = valueResult }; 
    object actualValue = null; 
    try 
    { 
     actualValue = Convert.ToDecimal(valueResult.AttemptedValue, CultureInfo.CurrentCulture); 
    } 
    catch (FormatException e) 
    { 
     modelState.Errors.Add(e); 
    } 

    bindingContext.ModelState.Add(bindingContext.ModelName, modelState); 
    return actualValue; 
    } 
} 

Sau đó, trong global.asax bạn đăng ký chất kết dính của bạn và bạn đã hoàn tất

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
    //Here you tell how to hendle the specific type 
    ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder()); 
} 

CẬP NHẬT

Sau khi làm rõ của bạn this answer nên giúp

+0

phản hồi nhanh chóng! cảm ơn! Tôi sẽ thử outlook – Ben

+0

đã thử một cách tiếp cận tương tự như vậy, nhưng không thể làm cho nó hoạt động được, tôi đã cập nhật câu hỏi của mình với nỗ lực của tôi – Ben

+0

Cập nhật câu trả lời để sử dụng toàn cầu hóa trong xác nhận phía khách hàng của bạn – Iridio

1

Tôi tin rằng có lỗi trong phiên bản tập lệnh của ngày jquery ui bộ chọn đi kèm với khung mvc3 (jquery-ui-1.8.11.js).

Nếu bạn chỉ định ngày theo định dạng uk (như thực sự các bang blog):

$(document).ready(function() { 
    $('.date').datepicker({dateFormat: "dd/mm/yy"}); 
}); 

sau đó jquery-ui-1.8.11.js dường như có một vấn đề với việc chứng thực ngày và giữ hỏi cho một ngày uk hợp lệ (nhưng xác nhận xuất hiện ngẫu nhiên).Nếu bạn thay đổi định dạng ngày thành "mm/dd/yy" thì vấn đề này sẽ biến mất nhưng điều đó không tốt cho các ngày ở uk.

Vấn đề này đã được giải quyết trong một phiên bản sau này của thư viện đó để tải về phiên bản mới nhất (tôi tin rằng 1.8.18 tại thời điểm viết bài) hoặc tham khảo các cdn:

<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js" type="text/javascript"></script> 
+0

có vẻ như tôi đang sử dụng phiên bản cũ hơn một chút (1.8.7) để hoán đổi trong cái mới, và nó không có sự khác biệt. cảm ơn mặc dù – Ben

0

Tôi đã có vấn đề này chỉ cần bây giờ, đã cho tôi giờ để theo dõi lý do. Tôi không nói đây là vấn đề của bạn nhưng sau khi đã dành nhiều giờ để chuyển đổi toàn cầu hóa mọi thứ, v.v ... tôi nghĩ tôi sẽ đăng vấn đề ở đây cho bất kỳ người nào đấu tranh như tôi.

Dù sao thì, vấn đề trong dự án của tôi thực sự không phải như tôi nghĩ. Tôi đã trang trí các tài sản với [DataAnnotationsExtentions.Date] mà, nó quay ra, mucks lên xác nhận phía khách hàng trong chrome khi nói đến nội địa hóa (tức là nếu bạn muốn một ngày sau ngày thứ 12 ở Anh) mặc dù nó có vẻ làm việc tốt trong các trình duyệt khác. Ngay sau khi tôi xóa rằng nó đã hoạt động

1

Trên thực tế tôi đã tìm thấy một giải pháp tốt hơn ở đây .... bởi #fretje

Override jquery date

tôi đã sửa đổi/code của mình một chút mặc dù vậy nó vẫn có thể tận định dạng ngày như 30 tháng 5 năm 2012 dưới đây.

$(function() { 
    $.validator.addMethod(
     "date", 
     function (value, element) { 

      //Added to validate dates like 31 May 2012 
      if (value.split('/').length === 1) 
       return this.optional(element) || !/Invalid|NaN/.test(new Date(value)); 

      var bits = value.match(/([0-9]+)/gi), str; 
      if (!bits) 
       return this.optional(element) || false; 
      str = bits[1] + '/' + bits[0] + '/' + bits[2]; 
      return this.optional(element) || !/Invalid|NaN/.test(new Date(str)); 
     }, 
     "Please enter a date in the format dd/mm/yyyy" 
    ); 

    $global.init(); 
}); 
0

Vấn đề là do một số lý do nếu bạn đặt một lớp được gọi là "ngày" trong textbox của bạn, Chrome chỉ nhận được điên như discribed đây tại this blog. Tôi đã có cùng một vấn đề và tôi chỉ cần thay đổi tên lớp để customDate và nó đã được giải quyết.

+0

Vui lòng không đăng câu trả lời chỉ cho liên kết –

Các vấn đề liên quan