2016-04-15 5 views
0

В нашем веб-приложении MVC 3 мы определяем Thread.CurrentThread.CurrentCulture с настройками текущего пользователя. Однако в одном представлении мы передаем данные через Ajax всегда в формате mm/dd/yyyy, это прекрасно работает, пока культура пользователя равна en_US. (очевидно)DateTime анализирует по-разному при передаче через HTTP-POST в теле и через HTTP-GET как параметры запроса

Удивительная вещь, она работает для всех пользователей, когда мы передаем ее как HTTP-POST, но перестает работать, когда передаем ее как HTTP-GET. (В обоих случаях одно и то же значение выходит из браузера).

Любые идеи, по которым вызовы HTTP-POST обрабатывались бы иначе, чем HTTP-GET?

Кроме того, для этого действия существуют другие параметры. В случае HTTP-POST, все они установлены в теле, как:

{ 
    "date": "04/15/2016", 
    "someText": "Hello World", 
    "someNumber": 42 
} 

и HTTP-GET они являются параметрами запроса вместо:

domain.tld/controller/action?date=04%2F15%2F2016&someText=Hello+World&someNumber=42 

Update:

Чтобы избежать путаницы, метод вызывается правильно и возвращает значения в обоих случаях. Это просто, что параметр DateTime (который на самом деле DateTime?) не устанавливается, точно так же, как если бы я установил его на некорректную дату/строку.

+1

Я думаю, что ваша последняя строка текста должна быть прочитана «и для HTTP-GET» – SPlatten

+0

@SPlatten вы абсолютно правы, пробуйте эту ошибку – peter

ответ

3

Любые идеи, по которым вызовы HTTP-POST обрабатывались бы иначе, чем HTTP-GET?

по умолчанию модель связующего используются следующие культуры в зависимости от HTTPVERB

  • InvariantCulture для вашего HttpGet
  • CurrentCulture для ваших запросов HttpPost.

Это связано с тем, что пользователи будут делиться своими URLS (HTTPGET) с другими пользователями из разных культур.

Представьте, что у нас есть пользователь из Америки, который хочет отправить URL-адрес своему другу в Соединенном Королевстве о событии, которое состоится 15.04.2016. (15 апреля 2016 года). Они дают их друг следующий URL ...

http://www.myurl.com/tickets/?eventdate=04%2F15%2F2016 

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

Что касается HTTPPOST, пользователи обычно не будут обмениваться этими типами запросов с другими пользователями, поскольку они обычно генерируются для каждого пользователя. Поэтому мы можем явно использовать CurrentCulture.

Вы можете переопределить это поведение по умолчанию, создав собственное связующее устройство.

Надеюсь, это поможет!

+0

thx для дополнительного объяснения, почему GET использует инвариант – peter

-1

Можете ли вы проверить, является ли ваш обработчик запроса GET or POST, если он был установлен на POST, тогда запрос GET не может быть обработан.

редактировать ** Игнорируйте ниже единицы **: поскольку кодирование URL является одинаковым в обоих методах

«Единственная разница, что в GET запроса все специальные символы будут закодированы for. ex/to %2f где в POST это не случится «.