2010-10-22 2 views
2

Я пытаюсь выяснить, не понимаю ли я что-то о ASP.NET MVC или обнаружил ли я какую-то ошибку в ASP.NET MVC Beta 3. У меня возникла проблема с PartialView подбирая неправильную модель при использовании HTML Helper расширенияASP.NET MVC 3 и расширения HTML-помощника

Мой контроллер код выглядит следующим образом:

public ActionResult EditGeneral(MapGeneralViewModel vm) 
{ 
    var query = MapGeneralViewModel.ToModel(vm, svcMaps); 

    return PartialView("General", MapGeneralViewModel.FromModel(query)); 
} 

В случае это время вставки, свойство vm.Id начинается как -1 и после вызова MapGeneralViewModel.ToModel it была сохранена база данных и query.Id имеет правильное значение.

Звонок в MapSettingsViewModel.FromModel возвращает новую модель просмотра, и я проверил, что значение свойства Id содержит вновь созданное значение id.

Соответствующие биты зрения выглядеть следующим образом:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<AdminWebRole.Models.Map.MapGeneralViewModel>" %> 
      <%: Model.Id %> 
      <%= Html.Hidden("IdTest", Model.Id) %> 
      <%= Html.HiddenFor(model => model.Id) %> 

Если я ставлю точку останова в представлении, Model.Id правильно установлен на правильное значение.

Фактический выход контроллера (когда Model.Id == 70) выглядит следующим образом:

70 
    <input id="IdTest" name="IdTest" type="hidden" value="-1" /> 
    <input id="Id" name="Id" type="hidden" value="-1" /> 

Таким образом, выходное значение без использования HTML-хелперы правильно, но вывод значений по помощники каким-то образом собирают обзорную модель, которая была передана в контроллер!

Я понятия не имею, как это происходит. Я пробовал различные вещи:

  • Использование View(), а не PartialView()
  • присваивающей результаты MapGeneralViewModel.FromModel() к ут и затем передавая виртуальную машину к вид
  • с использованием <%: и <% =
  • установка VM на нуль (старая модель представления как-то еще используется)
  • изменения значения входящего идентификатора 0 (результатов в 0 выводимых в представлении вместо -1)
  • проблема не специфична для свойств, называемых «Id», я также проверил другие поля с тем же результатом

Я запутался в том, как это должно работать, или я ударил бета-ошибку? Если это имеет какое-либо значение, это выполняется внутри локальной локальной среды Azure на 64-битной машине Win7.

ответ

1

Нет никакого способа, чтобы MVC просто собирал переменную, которую вы явно не передали в ваш просмотр или не висели в сеансе или в TempData.

Поскольку вы устанавливаете этот идентификатор равным -1, я начинаю искать проблемы.

Другая возможность заключается в том, что в вашей модели ModelState -1 находится где-то. HTML-помощники сначала обращаются к ModelState, прежде чем решают использовать любые значения, которые вы передаете.

+0

Это, кажется, идет от ModelState. Чтение вокруг кажется, что я не должен использовать HTML Helpers для свойств на модели, которые изменились с момента публикации Tom Control. В этом случае это будет только свойство Id. Имеет ли это смысл ? – andynormancx

+0

@andynormancx, да, ModelState жадные HtmlHelpers укусят всех, кому это кажется. – jfar

+0

Кажется, это очень странный способ работать. – andynormancx

1

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

Для отображения скрытого ввода я использовал следующее.

@Html.Hidden("salesorderlineid", orderLine.SalesOrderLineID)

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

Я закодировал скрытый ввод непосредственно как html, и он отлично работает - похоже, возможно, ошибка MVC3?

<input type="hidden" name="salesorderlineid" value="@orderLine.SalesOrderLineID"/>