Глобализация MVC3 не установлена ​​для ModelState.Value.Culture

Я установил культуру в 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 ответа

Решение

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

            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. так что я все еще ищу кого-то, чтобы найти хорошее решение для этого.

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

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

Поместите в ваш web.config следующее:

<configuration>
   <system.web>
      <globalization
           fileEncoding="utf-8"
           requestEncoding="utf-8"
           responseEncoding="utf-8"
           culture="fr-BE"
           uiCulture="fr-BE"
        />
   </system.web>
</configuration>
Другие вопросы по тегам