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

В чем разница между Html.Hidden и Html.HiddenFor

Я могу найти хорошее определение для Html.HiddenFor на MSDN, но единственное, что я могу найти на Html.Hidden, связано с проблемами, которые у него есть.

Может ли кто-нибудь дать мне хорошее определение и пример.

4b9b3361

Ответ 1

Большинство вспомогательных методов MVC имеют вариант XXXFor. Они предназначены для использования в сочетании с конкретным классом модели. Идея состоит в том, чтобы позволить помощнику получить соответствующий атрибут "name" для элемента управления ввода-вывода на основе свойства, указанного вами в лямбда. Это означает, что вы можете устранить "магические строки", которые в противном случае вам пришлось бы использовать для сопоставления свойств модели с вашими взглядами. Например:

Html.Hidden("Name", "Value")

приведет к:

<input id="Name" name="Name" type="hidden" value="Value">

В вашем контроллере у вас может быть действие вроде:

[HttpPost]
public ActionResult MyAction(MyModel model) 
{
}

И модель вроде:

public class MyModel 
{
    public string Name { get; set; }
}

Необработанный Html.Hidden, который мы использовали выше, будет коррелирован с свойством Name в модели. Однако несколько неприятно, что значение "Имя" для свойства должно быть указано с помощью строки ( "Имя" ). Если вы переименуете свойство Name в Модели, ваш код сломается, и ошибку будет сложно определить. С другой стороны, если вы используете HiddenFor, вы получите защиту от этого:

Html.HiddenFor(x => x.Name, "Value");

Теперь, если вы переименуете свойство Name, вы получите явную ошибку времени выполнения, указывающую, что свойство не может быть найдено. Кроме того, вы получаете другие преимущества статического анализа, такие как получение выпадающего списка после ввода x..

Ответ 2

Html.Hidden создают скрытый ввод, но вам нужно указать имя и все атрибуты, которые вы хотите дать этому полю и значению, в то время как Html.HiddenFor создать скрытый ввод для объекта, который вы передаете ему, они выглядеть так:

Html.Hidden("yourProperty",model.yourProperty);

Html.HiddenFor(m => m.yourProperty)

В этом случае вывод такой же!

Ответ 3

Каждый метод класса HtmlHelper имеет двойник с суффиксом For. Html.Hidden берет строку в качестве аргумента, которую вы должны предоставить, но Html.HiddenFor принимает выражение, которое, если вы видите, - это строго типизированное представление, вы можете извлечь выгоду из этого и передать этот метод лямбда-выражения, как этот

o=>o.SomeProperty 

вместо "SomeProperty" в случае использования метода Html.Hidden.

Ответ 4

Html.Hidden('name', 'value') создает скрытый тег с именем = 'name' и value = 'value'.

Html.HiddenFor(x = > x.nameProp) создает скрытый тег с именем = 'nameProp' и значением = x.nameProp.

По номиналу они кажутся похожими на вещи, причем один из них более удобен, чем другой. Но его фактическое значение для привязки модели. Когда MVC пытается связать html с моделью, он должен иметь имя свойства, а для Html.Hidden мы выбрали "имя", а не "nameProp", и, следовательно, привязка не будет работать. Вы должны иметь собственный объект привязки или получить значения из данных формы. Если вы повторно просматриваете страницу, вам придется снова установить модель на значения.

Таким образом, вы можете использовать Html.Hidden, но если вы ошиблись в названии или измените имя свойства в модели, автоматическая привязка не удастся при отправке формы. Но, используя выражение типа checked, вы получите завершение кода, а когда вы измените имя свойства, вы получите ошибку времени компиляции. И тогда у вас будет гарантированное правильное имя в форме.

Одна из лучших возможностей MVC.

Ответ 5

Html.Hidden и Html.HiddenFor используются для генерации пар имя-значение, которые ожидали методом действия в контроллере. Пример использования (*):

@using (Html.BeginForm("RemoveFromCart", "Cart")) {
                    @Html.Hidden("ProductId", line.Product.ProductID)
                    @Html.HiddenFor(x => x.ReturnUrl)
                    <input class="btn btn-sm btn-warning"
                           type="submit" value="Remove" />
                }

Если ваш метод действия ждет "ProductId" , вы должны сгенерировать это имя в форме с помощью (Html.Hidden или Html.HiddenFor) Для случая невозможно сгенерировать это имя с помощью строго типизированной модели, вы просто напишите это имя со строкой, которая называется "ProductId" .

public ViewResult RemoveFromCart(int productId, string returnUrl){...}

Если бы я написал Html.HiddenFor(x = > line.Product.ProductID), помощник отобразил бы скрытое поле с именем "line.Product.ProductID".   Имя поля не будет соответствовать именам параметров для метода действия "RemoveFromCart", который ожидает имя "ProductId" . Это предотвратило бы работу с привязками модели по умолчанию, поэтому MVC Framework не сможет вызвать метод.

* Адам Фримен (Apress - Pro ASP.Net MVC 5)