2010-10-05 3 views
97

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

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

Где эти помощники должны войти в код?

ответ

101

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

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

Рассмотрим следующий 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> 
+0

Где следует, что помощник идти в коде? – JPCF

+0

<% = Html.HiddenFor (model.Id)%>
в своем примере выше –

+9

Я бы сказал «увиденный» пользователем. Пользователи могут «изменять» все, что они хотят, скрытые или нет. –

7

И для использования скрытого ввода ID в вашем методе действия редактирования:

[HttpPost] 
public ActionResult Edit(FormCollection collection) 
{ 
    ViewModel.ID = Convert.ToInt32(collection["ID"]); 
} 
+8

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

+0

@Yetti: Неверно. Существует веская причина, что механизм лесов поднимает поле идентификатора. Удалите его из одного из моих уроков и используйте Fiddler, чтобы увидеть, что это не в теле сообщения. – RickAndMSFT

+2

Я не уверен, как комментарий неверен. Если модель является свойством * For() * 'd в представлении, метод контроллера должен быть строго типизирован и автоматически заполнен ModelBinder. –

2

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

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

Чтобы увидеть большую мотивацию для html.hiddenfor, я рекомендую вам посмотреть Passing data from a View to a Controller in .NET MVC - "@model" not highlighting

Смежные вопросы