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.Forms
và Forms
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.
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. –
Đã 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