Подтвердить что ты не робот

Hiddenfor не получает правильное значение из модели просмотра

У меня есть многошаговый процесс импорта файлов. У меня есть скрытая форма ввода в моем представлении, что я пытаюсь заполнить "CurrentStep" из модели представления.

<% = Html.HiddenFor(model => model.CurrentStep) %>

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

<p><% = Model.CurrentStep %></p>

Я понимаю, что могу просто передать код скрытого ввода, но я хочу знать: что я делаю неправильно? Есть ли лучший способ отслеживать текущий шаг между POST?

Спасибо заранее.

4b9b3361

Ответ 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, чтобы сохранить чистоту.