Що робить Html.HiddenFor?


105

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

Чи може хтось пояснити його використання та навести короткий приклад?

Куди повинні входити коди цих помічників?

Відповіді:


112

Він створює приховану інформацію у формі для поля (від вашої моделі), яке ви передаєте.

Корисно для полів у вашій моделі / 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>

<% = Html.HiddenFor (model.Id)%> <br /> у своєму прикладі вище
Брайс Фішер

11
Я б сказав "бачив" користувачем. Користувачі можуть "модифікувати" все, що хочуть, приховано чи ні.
Крейг Стунц

@Craig - Ти маєш рацію. Я насправді хоч і змінив це формулювання, але, мабуть, ні.
Джастін Нісснер

І зазвичай він використовується для ідентифікатора (як у прикладі вище), який, як правило, не хочеться відображати.
RickAndMSFT

Я трохи розгублений, оскільки модель перегляду не є параметрами контролера. То чому б ім'я вводу генерувалося на полях моделі перегляду?
Джон

8

І щоб споживати прихований вхідний код назад у вашому методі редагування дій:

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

8
Хоча це технічно вірно, вам не слід цього робити, якщо форма сильно набрана для моделі перегляду. Ви повинні мати доступ безпосередньо до моделі, що знімає необхідність будь-якого перетворення.
Ітті

@Yetti: Неправильно. Є вагома причина, що механізм риштування додає поле ID. Видаліть його з одного з моїх підручників і скористайтеся Fiddler, щоб побачити, що його немає в тілі публікації.
RickAndMSFT

2
Я не впевнений, наскільки коментар невірний. Якщо у представленні Model є властивістю For () 'd, метод контролера повинен бути сильно набраний та автоматично заповнений ModelBinder.
Ерік Філіпс

2

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

Поки що дискусія була зосереджена на простому прихованні ідентифікатора, але це лише одне значення, чому б не використовувати його для безлічі значень! Це те, що я роблю, я використовую це для завантаження значень у класі лише одного перегляду за один раз, тому що html.beginform створює новий об'єкт, і якщо ваш модельний об'єкт для цього перегляду вже мав деякі значення, передані йому Значення будуть втрачені, якщо ви не посилаєтесь на ці значення у формі запуску.

Щоб побачити відмінну мотивацію html.hiddenfor, я рекомендую переглянути розділ Передача даних з представлення на контролер у .NET MVC - "@model" не виділяється


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.