В чем разница между Html.Hidden и Html.HiddenFor - PullRequest
57 голосов
/ 08 декабря 2010

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

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

Ответы [ 5 ]

106 голосов
/ 08 декабря 2010

Большинство вспомогательных методов 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..

15 голосов
/ 08 декабря 2010

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

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

Html.HiddenFor(m => m.yourProperty)

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

7 голосов
/ 08 декабря 2010

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

o=>o.SomeProperty 

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

3 голосов
/ 17 сентября 2015

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

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

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

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

Одна из лучших функций MVC.

2 голосов
/ 30 июля 2015

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)

...