Потеря данных ViewModel после POST - PullRequest
4 голосов
/ 20 марта 2012

Я не вижу этой проблемы слишком часто, но у меня есть .cshtml, который использует макет. В макете у меня есть:

@using (Html.BeginForm(null, null, FormMethod.Post, new { @class = "someCssClass", @id = "UserForm" }))
{
      ...rest of the code
}

Мой основной .cshtml, использующий этот макет, имеет модель, определенную вверху, как мы всегда делаем:

@model CarViewModel 
@{
    Layout = "~/Views/Shared/_CarLayout.cshtml";
}

Когда возвращается к моему методу действия, я получаю нулевые значения для всех значений модели:

public ActionResult Cars(CarViewModel model)
{
    carBL.RemoveCars(model.CarIds, model.DealerId);
    ...
}

Не уверен, что мне нужно делать здесь и почему это происходит. Обычно я просто получаю его обратно с помощью автосвязки. Мне кажется, что когда в разметке используется модель через RAzor, она возвращается в порядке с возвращенным ViewModel, но если я не использую эти поля, это не так ... поэтому я предполагаю, что это работает, и если Я не использую их в разметке. Мне нужно отправить их обратно как скрытые значения, чтобы принудительно сохранить постоянство, поскольку я не использую поля x из ViewModel (который бы автоматически сохранял эти поля, если бы я использовал их в форме )

Ответы [ 3 ]

13 голосов
/ 20 марта 2012

Если значения не связаны с полем формы, они вернутся нулевыми.

в форме используйте ниже для таких вещей, как поля ID.

@Html.HiddenFor(x => x...)
0 голосов
/ 20 марта 2012

Не уверен, что это уже решено, но вот как я это делаю (частичный код):

@model MyProject.ViewModels.MyViewModel

@using (Html.BeginForm())
{
     <table>
          <tr>
               <td>First Name:</td>
               <td>@Html.TextBoxFor(x => x.FirstName, new { maxlength = "50" })
                   @Html.ValidationMessageFor(x => x.FirstName)
               </td>
          </tr>
     </table>

     <button id="btnSave" type="submit">Save</button>
     <button id="btnCancel" type="button">Cancel</button>
}

Затем мой метод действия для обработки HTTP-запроса на публикацию:

[HttpPost]
public ActionResult Create(MyViewModel viewModel)
{
     // Check for null on viewModel
     // Do what needs to be done
}

Выполнение этого не должно позволить вам потерять значения, заполненные в форме / представлении.

0 голосов
/ 20 марта 2012

Быстрый тест для проверки правильности размещения формы будет означать изменение подписи вашего действия:

public ActionResult Cars(FormCollection form)
{
    ...
}

Если form не заполнено, то у вас есть проблема с формойсообщение.Кроме того, обратите внимание, что вы можете выполнить это при просмотре данных публикации формы с помощью таких инструментов, как FireBug, Chrome Dev или Fiddler, если вы предпочитаете.

Если форма публикуется правильно, то вам следует проверитьчтобы убедиться, что имена полей ввода в форме совпадают с именами ожидаемых CarViewModel.

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