ASP.NET MVC: механизм связывания моделей по умолчанию не работает в Safari (но работает для Firefox) - PullRequest
1 голос
/ 19 июля 2010

Очень странная проблема ... У меня что-то вроде этого в моем контроллере:

public ActionResult Initialize(IEnumerable<MyModel> Requests)
{
...

}

Я создаю элементы формы в моем представлении представления, которые выглядят так:

Requests[90ed54f6-4650-44c7-8cc2-c4d225a9a334].Name
Requests[90ed54f6-4650-44c7-8cc2-c4d225a9a334].Address
Requests[db67e8e5-94f8-4b35-b69c-65184980f2a1].Name
Requests[db67e8e5-94f8-4b35-b69c-65184980f2a1].Address

Вкл.Firefox, когда я отправляю это с несколькими элементами, связыватель работает, и я получаю коллекцию объектов.В Safari одни и те же данные всегда генерируют только 1 объект в коллекции.

Странно, если в отладчике я смотрю Requests.Params.AllKeys [], я вижу значения - они отправляются,просто как-то не обязательно.Я использую Firebug в Firefox, но у меня нет аналогичного инструмента для Safari.Поскольку я вижу значения в Request.Params, я предполагаю, что это не проблема с передачей значений формы - просто что-то о том, как они связаны с ViewModel ...

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

Любые идеи, что это может быть или как я могу преследовать это?

Редактировать: Это правильно работает и в IE - просто Safari ведет себя странно.

Редактировать 2: Я солгал ...Safari не публикует значения индекса, как я ожидал:

Requests.index = {GUID}
Requests[90ed54f6-4650-44c7-8cc2-c4d225a9a334].Name
Requests[90ed54f6-4650-44c7-8cc2-c4d225a9a334].Address
Requests.index = {GUID}
Requests[db67e8e5-94f8-4b35-b69c-65184980f2a1].Name
Requests[db67e8e5-94f8-4b35-b69c-65184980f2a1].Address

И Firefox, и Internet Explorer публикуют оба значения Requests.index как значения, разделенные запятыми, но Safari публикует только первое.Я не уверен, что «правильно» для этого случая, но это то, во что я могу погрузиться.

Ответы [ 3 ]

1 голос
/ 19 июля 2010

Я предполагаю, что "index" - это GUID, который функционирует как идентификатор запроса. Я предполагаю, что вы на самом деле сгенерируете что-то вроде:

 <input type="hidden" name="Requests[0].ID" value="90ed54f6-4650-44c7-8cc2-c4d225a9a334" />
 <input type="text" name="Requests[0].Name" />
 <input type="text" name="Requests[0].Address" />

Конечно, ваш класс MyModel должен иметь свойство ID для хранения Guid.

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

0 голосов
/ 26 июля 2010

Таким образом, окончательное решение было связано с неправильно размещенными тегами <input>.В частности, я размещал скрытую <input> после <tr> и до <td>.В Firefox и IE это очень простительно, и это сработало.В Safari по какой-то причине он не будет рассматривать 2-й элемент как допустимые входные данные формы.Размещение элементов <input> внутри <td> работает для всех браузеров.

Спасибо за вашу помощь, ребята.

0 голосов
/ 19 июля 2010

Сравните фактические значения POST'd для каждого браузера:

public ActionResult Initialize(FormCollection collection)
{
  //... dump the collection's NameValueCollection ...
}

И сравните фактическое отображение формы HTML между браузерами, просто чтобы быть уверенным.

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