Hiddenfor не получает правильное значение из модели просмотра
У меня есть многошаговый процесс импорта файлов. У меня есть скрытая форма ввода в моем представлении, что я пытаюсь заполнить "CurrentStep" из модели представления.
<% = Html.HiddenFor(model => model.CurrentStep) %>
CurrentStep - это Enum, и я всегда получаю значение по умолчанию, а не тот, который я предоставил модели представления. с другой стороны, это дает мне правильное значение:
<p><% = Model.CurrentStep %></p>
Я понимаю, что могу просто передать код скрытого ввода, но я хочу знать: что я делаю неправильно? Есть ли лучший способ отслеживать текущий шаг между POST?
Спасибо заранее.
Ответы
Ответ 1
Что вы делаете неправильно, так это то, что вы пытаетесь изменить значение переменной POSTed в действии вашего контроллера. Поэтому я предполагаю, что вы пытаетесь это сделать:
[HttpPost]
public ActionResult Foo(SomeModel model)
{
model.CurrentStep = Steps.SomeNewValue;
return View(model);
}
Помощники и html, такие как HiddenFor, всегда будут использовать значение POSTED и после этого значение в модели.
Итак, у вас есть несколько возможностей:
-
Удалите значение из состояния модели:
[HttpPost]
public ActionResult Foo(SomeModel model)
{
ModelState.Remove("CurrentStep");
model.CurrentStep = Steps.SomeNewValue;
return View(model);
}
-
Вручную создайте скрытое поле
<input type="hidden" name="NextStep" value="<%= Model.CurrentStep %>" />
-
Напишите пользовательский помощник, который будет использовать значение вашей модели, а не тот, который был POSTed
Ответ 2
Мое решение состояло в том, чтобы использовать второй параметр Darin, потому что опция 1 (очистка от состояния модели) означает жесткое кодирование строки (и соглашение об именах может быть сложным с сложными моделями), и он хотел избежать варианта 3, потому что у меня уже есть так много пользовательских помощников.
<input type="hidden" name="@Html.NameFor(x => Model.SomeId)" value="@Model.SomeId" />
Напоминаем, что вы можете использовать Html.NameFor
, чтобы сохранить чистоту.