Глобализация 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>