.NET DataAnnotation и проблема глобализации (на стороне сервера) - PullRequest
2 голосов
/ 14 ноября 2011

Формат дат в Северной Америке - ММ / дд / гггг

Я работаю над проектом (asp.net MVC 2) для Австралии, где формат даты - д / мм / гггг

вweb.config У меня

        <globalization
        fileEncoding="utf-8"
        requestEncoding="utf-8"
        responseEncoding="utf-8"
        culture="en-AU"
        uiCulture="en-AU"
        enableClientBasedCulture="true"
    />

в представлениях .net отображает даты в правильном формате - "en-AU", но когда я отправляю форму с датой 14/11/2011, мой ModelState.IsValid равен False.

Как научить аннотации данных правильно проверять даты в формате "en-AU"?

// update

только что обнаружил, что проблема связана только с GET

using(Html.BeginForm("Search", "form", FormMethod.Post)) //Works
using(Html.BeginForm("Search", "form", FormMethod.Get)) //Does'n work

** Похоже, это ошибка .net !!!

Я пробовал новые проекты mvc2 / 3

, когда я использую GET, привязка mvc не использует текущую культуру**

Спасибо.

Ответы [ 3 ]

6 голосов
/ 15 ноября 2011

Это поведение является намеренным. Когда вы делаете запрос GET, он помещает дату в URL. ASP.NET MVC предполагает, что даты в URL являются инвариантной культурой.

Почему?

Предположим, я создал следующий URL: / posts / 01-11-2011 / и отправил его вам. Что это значит для вас?

Что ж, значит, покажи мне сообщения 11 января 2011 года, потому что это работает на мою культуру. Но ваша культура, вероятно, обозначает это как 01 ноября 2011 года. URL должны однозначно идентифицировать ресурс. Один и тот же URL не должен иметь разных значений в зависимости от того, кто на него смотрит.

Поэтому мы решили, что наши связыватели моделей не будут преобразовывать значения из URL в текущую культуру, но будет преобразовывать значения из публикации формы. Это имело смысл для нас, потому что сообщение формы не может быть разослано и, как правило, представляет собой ввод пользователя.

1 голос
/ 28 декабря 2011

Наконец-то у меня есть решение, спасибо за десятки различных постов и статей в блогах. Работайте отлично, плюс вы можете применять его не только для свиданий.

//Global.asax.cs
protected void Application_Start()
{
    ModelBinders.Binders[typeof (DateTime)] = new ForceCultureModelBinder<DateTime>();
    ModelBinders.Binders[typeof(DateTime?)] = new ForceCultureModelBinder<DateTime>();
}

и класс

public class ForceCultureModelBinder<T> : IModelBinder where T : struct
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
            throw new ArgumentNullException("bindingContext");

        T? valueAttempt = GetA(bindingContext);
        return valueAttempt == null ? (object) null : valueAttempt.Value;
    }

    private T? GetA(ModelBindingContext bindingContext)
    {
        ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (valueResult == null)
            return null;

        T? result;
        try
        {
            result = (T?) valueResult.ConvertTo(typeof (T), Thread.CurrentThread.CurrentCulture);
        }
        catch (Exception)
        {
            bindingContext.ModelState.AddModelError(
                    bindingContext.ModelName, 
                    ex.InnerException.Message);
            return null;
        }

        return result;
    }
}
0 голосов
/ 14 ноября 2011

У Хансельмана есть хороший пост о том, как обращаться с этой клиентской стороной, где он делает что-то вроде:

$(document).ready(function () {
        //Ask ASP.NET what culture we prefer
        $.getJSON('/locale/currentculture', function (data) {
            //Tell jQuery to figure it out also on the client side.
            $.global.preferCulture(data);
        });
    });

источник: http://www.hanselman.com/blog/GlobalizationInternationalizationAndLocalizationInASPNETMVC3JavaScriptAndJQueryPart1.aspx

Я верю, что плагин теперь называется globalize (найдено здесь ), но API должен быть похожим, если не точно таким же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...