Что делает Html.HiddenFor?

106

Хотя я прочитал документацию по Html.HiddenFor, я не понял, для чего он используется ...

Может ли кто-нибудь объяснить его использование и привести короткий пример?

Куда должны идти эти помощники в коде?

JPCF
источник

Ответы:

113

Он создает скрытый ввод в форме для поля (из вашей модели), которое вы ему передаете.

Это полезно для полей в вашей модели / модели представления, которые вам нужно сохранить на странице и передать обратно, когда выполняется другой вызов, но не должны быть видны пользователю.

Рассмотрим следующий класс ViewModel:

public class ViewModel
{
    public string Value { get; set; }
    public int Id { get; set; }
}

Теперь вы хотите, чтобы страница редактирования сохраняла идентификатор, но не отображала его:

<% using(Html.BeginForm() { %>
    <%= Html.HiddenFor(model.Id) %><br />
    <%= Html.TextBoxFor(model.Value) %>
<% } %>

В результате получается эквивалент следующего HTML:

<form name="form1">
    <input type="hidden" name="Id">2</input>
    <input type="text" name="Value" value="Some Text" />
</form>
Джастин Нисснер
источник
<% = Html.HiddenFor (model.Id)%> <br /> в приведенном выше примере
Брайс Фишер,
11
Я бы сказал «видел» пользователь. Пользователи могут «изменять» все, что они хотят, скрытые или нет.
Craig Stuntz
@Craig - Ты прав. На самом деле я изменил эту формулировку, но, видимо, нет.
Джастин Нисснер
И обычно он используется для идентификатора (как в примере выше), который обычно не требуется отображать.
RickAndMSFT
Я немного сбит с толку, потому что модель представления не является параметрами контроллера. Так почему же имя ввода будет сгенерировано в полях модели представления?
Джон
8

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

[HttpPost]
public ActionResult Edit(FormCollection collection)
{
    ViewModel.ID = Convert.ToInt32(collection["ID"]);
}
Джеймс Стилл
источник
8
Хотя это технически верно, вам не нужно этого делать, если форма строго типизирована для модели представления. У вас должен быть доступ к модели напрямую, что избавляет от необходимости выполнять преобразование.
Йетти
@Yetti: Неверно. Есть веская причина, по которой механизм скаффолдинга добавляет поле ID. Удалите его из одного из моих руководств и используйте Fiddler, чтобы увидеть, что его нет в теле сообщения.
RickAndMSFT
2
Я не уверен, почему комментарий неправильный. Если модель является свойством For () 'd в представлении, метод контроллера должен быть строго типизирован и автоматически заполняться ModelBinder.
Erik Philips
2

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

До сих пор обсуждение было сосредоточено на простом сокрытии идентификатора, но это только одно значение, почему бы не использовать его для множества значений! Это то, что я делаю, я использую его для загрузки значений в классе только по одному представлению за раз, потому что html.beginform создает новый объект, и если ваш объект модели для этого представления уже имел некоторые значения, переданные ему, эти значения будут потеряны, если вы не укажете ссылку на эти значения в beginform.

Чтобы увидеть большую мотивацию для html.hiddenfor, я рекомендую вам увидеть « Передача данных из представления в контроллер в .NET MVC» - «@model» не выделяется

Девин Андрес Салеми
источник