Глобализация MVC3 не установлена ​​для ModelState.Value.Culture - PullRequest
1 голос
/ 08 июля 2011

Я установил культуру в Action Filer как

Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);

где культура = {fr-be} => французская Бельгия.

К вашему сведению, этот фильтр действий устанавливает культуру по выбору пользователя.

в одном из пользователей myAction вводит дату в формате [дд / мм / гггг] => 26/7/2011. Действие выглядит следующим образом

    public ActionResult RequestVacation(VacationRequest model)
    {
        if(ModelState.IsValid)
        {

....

когда я дублирую модель кода. VacationDate содержит 01/01/0001; хотя должно быть 26.07.2011 тогда как Форма [VacationDate] содержит 26/07/2011 [которая находится в Fr-BE форматате] И ModelState.IsValid имеет значение false; хотя это должно быть правдой, так как дата верна в формате fr-be. когда я выкопал фуртур но проверял местных жителей в визуальной студии я нашел

this.ModelState[1].Culture = {en-US}

тогда как я уже установил значение культуры с помощью actionFilter, как указано выше. Мой вопрос, как я могу установить this.ModelState.Culture = {fr-be}?

Ответы [ 3 ]

4 голосов
/ 19 декабря 2012

Немного поздно, чтобы ответить на ваш вопрос, но я представляю, что происходит то, что вы устанавливаете текущую культуру потоков в методе OnActionExecuting фильтра действий, но привязка модели происходит до этого, поэтому она не принимает ваши изменения .

Вам нужно переместить код, который устанавливает культуру на более раннем этапе в конвейере, до того, как произойдет привязка модели, например, в методе Application BeginRequest или AcquireRequestState, если вам нужно сохранить культуру в сеансе.

2 голосов
/ 25 октября 2011

Добавьте в ваш web.config следующее:

<configuration>
   <system.web>
      <globalization
           fileEncoding="utf-8"
           requestEncoding="utf-8"
           responseEncoding="utf-8"
           culture="fr-BE"
           uiCulture="fr-BE"
        />
   </system.web>
</configuration>
0 голосов
/ 10 июля 2011

В ответ на мой вышеупомянутый вопрос я решил его таким образом

            if (ModelState.Keys.Contains("VactionDate"))
        {
            ModelState err = ModelState["VactionDate"];
            if (!err.Value.Culture.Equals(Thread.CurrentThread.CurrentCulture))
            {
                try
                {
                    DateTime dt = Convert.ToDateTime(err.Value.AttemptedValue, Thread.CurrentThread.CurrentCulture.DateTimeFormat);
                    model.VactionDate = dt;
                    ModelState.Remove("VactionDate");
                }
                catch
                {
                }
            }
        }

Я знаю, что это не хорошее решение.но я все еще ищу какой-то способ изменить, до того, как проверка произойдет,

ModelState[n].Value.Culture = {en-US}

К

ModelState[n].Value.Culture = {fr-BE}

, где {fr-BE} - моя требуемая культура для анализа dateTime.так что я все еще ищу кого-то, чтобы найти хорошее решение для этого.

...