2013-07-17 16 views
6

Nó chỉ ra rằng DefaultModelBinder của MVC sử dụng các nền văn hóa khác nhau để phân tích các giá trị (ví dụ: double, DateTime, v.v ...) cho các yêu cầu POST và GET. Here là thông tin khác.Làm thế nào để thiết lập văn hóa của tất cả ValueProviderResult được sử dụng trong mô hình ràng buộc với một giá trị nhất định?

Tôi thấy rằng điều này được kiểm soát bởi thuộc tính Culture của các đối tượng ValueProviderResult, được trả lại từ IValueProvider.GetValue().

Câu hỏi của tôi là: Làm cách nào để đảm bảo rằng giá trị này luôn là CultureInfo.InvariantCulture.

Tôi biết tôi có thể triển khai nhà cung cấp giá trị tùy chỉnh và thực hiện theo cách này.

Tôi biết tôi có thể triển khai các trình kết nối mô hình tùy chỉnh và thực hiện theo cách này.

Tôi biết tôi có thể đặt văn hóa trong chuỗi nhưng tiếc là đây không phải là tùy chọn trong trường hợp của tôi.

Điều tôi đang tìm là một cách để đặt nó sao cho ngay cả trình kết nối mô hình mặc định và nhà cung cấp giá trị hiện tại có thể phân tích theo cách bất biến văn hóa, bất kể văn hóa chủ đề được đặt là gì.

Trả lời

4

Theo như tôi biết, không có cách nào phù hợp với tiêu chí của bạn. Bạn sẽ phải làm một trong những điều bạn biết bạn có thể làm (tôi muốn nói cách thích hợp nhất sẽ là nhà cung cấp giá trị tùy chỉnh).

Lý do: Tất cả giá trị mặc định của Trình cung cấp giá trị được mã hóa cứng để sử dụng CultureInfo.InvariantCulture hoặc CultureInfo.CurrentCulture.

đây, đặc biệt, là cách FormValueProvider làm nó:

internal FormValueProvider(
      ControllerContext controllerContext, 
      IUnvalidatedRequestValues unvalidatedValues 
     ) 
     : base(
       controllerContext.HttpContext.Request.Form, 
       unvalidatedValues.Form, 
       CultureInfo.CurrentCulture // <--- Grrr, argh 
     ) 
{ 
} 

Văn hóa không được lấy ra từ bất cứ nơi nào khác (ví dụ, các lập luận trên không được sử dụng như một mặc định, nhưng như là một nền văn hóa để sử dụng).

văn hóa của IValueProviders khác nhau

Để tham khảo, đây là những nền văn hóa cho mỗi IValueProviders mặc định:

  • ChildActionValueProvider: InvariantCulture
  • FormValueProvider: CurrentCulture
  • JsonValueProvider : CurrentCulture
  • RouteDataValueProvider: InvariantCulture
  • QueryStringValueProvider: InvariantCulture
  • HttpFileCollectionValueProvider: InvariantCulture

Thay thế CurrentCulture IValueProviders

Nó không phải là một nhiệm vụ rất lớn để thay thế FormValueProvider, vì, như đã thấy ở trên, nó chỉ gọi các lớp cơ sở của nó '(NameValueCollectionValueProvider) constructor - trong đó có văn hóa mong muốn như một đối số.

Việc triển khai ban đầu FormValueProvider xuất hiện trên bề mặt khó hơn so với thực tế, với tham chiếu đến các lớp và giao diện nội bộ. Nhưng chúng không cần thiết để thay thế nhà cung cấp - chúng chỉ ở đó để thử nghiệm đơn vị.

Bạn chỉ cần gọi cho các nhà xây dựng cơ sở (như đã đề cập ở trên), đi qua hai NameValueCollection s đó là dễ dàng để có được: Request.FormsForms tài sản của Validation.Unvalidated(Request) (một phương pháp tĩnh). Và đặt lập luận thứ ba cho văn hóa bạn muốn.

FormValueProviderFactory thậm chí còn đơn giản hơn.

JsonValueProvider là tham gia nhiều hơn một chút - về cơ bản bạn sẽ phải sao chép nguồn gốc của JsonValueProviderFactory để một lớp mới và sửa đổi nó - bởi vì mặc dù nó cho phép trọng GetValueProvider(), phương pháp mà chủ yếu bao gồm các cuộc gọi đến private static phương pháp khác.

EDIT (Petar Ivanov): Điều này phù hợp với tôi. Để làm cho nó hoạt động, nó không đủ để thêm nhà máy tùy chỉnh vào ValueProviderFactories.Factories, bởi vì cách này được thêm vào sau FormValueProviderFactory. Thay vào đó, tôi phải thay thế FormValueProviderFactory bằng tùy chỉnh.

+0

cảm ơn câu trả lời. Tôi đoán tôi đã không chắc chắn của các nhà cung cấp mặc định sử dụng CurrentCulture (và do đó tôi cần phải mở rộng), vì vậy tôi đã tìm kiếm một giải pháp tổng quát hơn. –

+0

Đã thêm danh sách. Tôi đã gỡ bỏ 'Session' và' TempData' - là một phần của MVC Futures và do đó không được sử dụng theo mặc định - tương tự với 'Cookie' và' ServerVariable'. Tất cả những người sử dụng 'InvariantCulture'. – JimmiTh

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