2012-01-18 27 views
19

Ứng dụng của tôi là setted với văn hóa pt-BR (ngày là dd-mm-yyyy) trong web.config:Đi qua một DateTime để điều khiển thông qua URL gây ra lỗi trong ASP NET MVC 3 (văn hóa)

<globalization enableClientBasedCulture="false" requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="iso-8859-15" responseHeaderEncoding="utf-8" resourceProviderFactoryType="string" enableBestFitResponseEncoding="true" culture="pt-BR" uiCulture="pt-BR" /> 

Tất cả DateTime được tạo ra trên hệ thống của tôi là ở định dạng đúng, nhưng tôi đã tạo ra một phương pháp điều khiển như thế:

public ActionResult Test(DateTime date) 
{ 
} 

gọi method đó trực tiếp trong trình duyệt được đi qua null khi ngày là với định dạng portuguese-br, như thế :

mysite/Test/?date=19/01/2012 => date = null in my controller 

mysite/Test/?date=01/01/2012 => date is fine, but in US format (mm-dd-yyyy) 

Làm cách nào để khắc phục điều đó, để chấp nhận định dạng ngày của tôi?

Trả lời

51

Có một Gotcha với chất kết dính mô hình mặc định đó không phải là dễ dàng để biết về nhưng một khi bạn biết nó, bạn không còn mắc sai lầm giống nhau:

  • Khi bạn sử dụng một yêu cầu POST, mô hình mặc định chất kết dính sử dụng cài đặt văn hóa của bạn để phân tích cú pháp ngày.

  • Khi bạn sử dụng yêu cầu GET, trình kết nối mô hình mặc định sử dụng CultureInfo.InvariantCulture để phân tích ngày và bỏ qua cài đặt văn hóa hiện tại của bạn.

Vì bạn đang sử dụng yêu cầu GET và chuyển ngày làm tham số chuỗi truy vấn, bạn nên định dạng ngày bằng định dạng văn bản bất biến khi gửi nó trong url. Cách chính xác để định dạng ngày của bạn dưới dạng thông số chuỗi truy vấn là yyyy-MM-dd.

Bạn có thể xem qua số following blog post để biết thêm chi tiết.

+1

Nếu bạn triển khai trình kết dính tùy chỉnh, hãy đảm bảo đăng ký nó cho DateTime? là tốt, không chỉ DateTime. – Justin

+0

Xin chào, Darin. Tôi đã gặp phải vấn đề tương tự như bài đăng gốc và câu trả lời của bạn và bài viết được trích dẫn đã giúp tôi hiểu vấn đề nhưng tôi chưa thể đưa ra câu trả lời. Tôi đang làm việc trên ASP.NET Core 2.0 nhưng tôi không biết làm thế nào để áp dụng các gợi ý của bài báo. Hy vọng bạn có thể xem xét câu hỏi này: https://stackoverflow.com/questions/47442368/routing-datetime-parameter-passing-as-null-empty –

2

Một cách tiếp cận sẽ là chấp nhận ngày dưới dạng chuỗi và sau đó điều khiển nó trong bộ điều khiển đến đúng ngôn ngữ/văn hóa.

8

Là một người làm việc rất nhiều với các công ty Hoa Kỳ, tôi đã có rất nhiều kinh nghiệm về các vấn đề về ngày tháng.

Lời khuyên tốt nhất của tôi là chọn định dạng rõ ràng khi truyền.

dd-MMM-yyyy 

yyyy-MM-dd 

Are cược an toàn, và sẽ được phân tích thành công bởi DateTime.Parse (obj).

Nếu thay đổi định dạng ngày không phải là một tùy chọn, bạn nên xem DateTime.ParseExact, cho phép bạn chỉ định chuỗi định dạng chính xác mà bạn đang theo dõi.

0

Có cùng vấn đề khi sử dụng chế độ xem @Html.Action(..) trong chế độ xem.Đối với trường hợp này nó có thể được giải quyết bằng cách đặt DateTime trong một mô hình:

public class MyModel 
{ 
    public DateTime Value {get;set;} 
} 

và trong giao diện:

@Html.Action("MyAction", new { myModel }) 

Lưu ý new { } xung quanh trường hợp của MyModel, cách này DateTime không chuyển đổi vào một chuỗi. Giải pháp này chỉ hoạt động cho Html.Action()không phải cho Html.ActionLink() hoặc Url.Action() vì MVC đang thực hiện một myModel.ToString() trong URL.

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