Wat is het verschil tussen Html.Hidden en Html.HiddenFor

Ik kan een goede definitie voor Html.HiddenFor vinden op MSDN, maar het enige dat ik kan vinden op Html.Hidden heeft te maken met problemen die het heeft.

Kan iemand me een goede definitie en een voorbeeld geven.


Antwoord 1, autoriteit 100%

De meeste MVC-helpermethoden hebben een XXXFor-variant. Ze zijn bedoeld om te worden gebruikt in combinatie met een concrete modelklasse. Het idee is om de helper het juiste “name”-attribuut voor het formulierinvoerbesturingselement af te leiden op basis van de eigenschap die u opgeeft in de lambda. Dit betekent dat u “magische strings” kunt elimineren die u anders zou moeten gebruiken om de modeleigenschappen te correleren met uw weergaven. Bijvoorbeeld:

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

Zal resulteren in:

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

In je controller heb je misschien een actie als:

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

En een model als:

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

De onbewerkte Html.Hiddendie we hierboven hebben gebruikt, wordt gecorreleerd met de eigenschap Namein het model. Het is echter enigszins onsmakelijk dat de waarde “Naam” voor de eigenschap moet worden opgegeven met een tekenreeks (“Naam”). Als u de eigenschap Nameop het model hernoemt, zal uw code breken en zal de fout enigszins moeilijk te achterhalen zijn. Aan de andere kant, als je HiddenForgebruikt, word je daartegen beschermd:

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

Als u nu de eigenschap Namehernoemt, krijgt u een expliciete runtime-fout die aangeeft dat de eigenschap niet kan worden gevonden. Daarnaast krijg je andere voordelen van statische analyse, zoals het krijgen van een vervolgkeuzelijst van de leden nadat je x.hebt getypt.


Antwoord 2, autoriteit 13%

De Html.Hidden creëert een verborgen invoer, maar u moet de naam en alle attributen specificeren die u aan dat veld en die waarde wilt geven. De Html.HiddenForcreëert een verborgen invoer voor het object dat je eraan doorgeeft, ze zien er als volgt uit:

Html.Hidden("yourProperty",model.yourProperty);
Html.HiddenFor(m => m.yourProperty)

In dit geval is de uitvoer hetzelfde!


Antwoord 3, autoriteit 6%

Elke methode in de klasse HtmlHelperheeft een tweeling met het achtervoegsel For.
Html.Hiddenneemt een string als argument dat je moet opgeven, maar Html.HiddenForneemt een Expressiedie als je view een is sterk getypeerde weergaveu kunt hiervan profiteren en die methode een lambda-expressiezoals deze geven

o=>o.SomeProperty 

in plaats van “SomeProperty” bij gebruik van de methode Html.Hidden.


Antwoord 4, autoriteit 2%

Html.Hidden(‘name’, ‘value’) maakt een verborgen tag aan met name = ‘name’ en value = ‘value’.

Html.HiddenFor(x => x.nameProp) creëert een verborgen tag met een naam = ‘nameProp’ en waarde = x.nameProp.

Op het eerste gezicht lijken deze vergelijkbare dingen te doen, waarbij de een handiger is dan de ander. Maar de werkelijke waarde is voor modelbinding. Wanneer MVC de html aan het model probeert te associëren, moet het de naam van de eigenschap hebben, en voor Html.Hidden hebben we ‘name’ gekozen en niet ‘nameProp’, en dus zou de binding niet werken. U moet een aangepast bindingsobject hebben of de waarden uit de formuliergegevens halen. Als u de pagina opnieuw weergeeft, moet u het model opnieuw op de waarden instellen.

Dus u kunt HTML.Hidden gebruiken, maar als u de naam verkeerd krijgt, of als u de eigenschapsnaam in het model wijzigt, wordt de automatische binding mislukt wanneer u het formulier verzendt. Maar door een type gecontroleerde uitdrukking te gebruiken, krijgt u code-voltooiing en wanneer u de eigenschapsnaam wijzigt, krijgt u een compileertijdfout. En dan heeft u gegarandeerd de juiste naam in het formulier.

een van de betere kenmerken van MVC.

Other episodes