What does Html.HiddenFor do?
Asked Answered
N

4

111

Although I have read the documentation on Html.HiddenFor, I've not grasped what is it used for...

Could somebody explain its uses and give a short example?

Where should those helpers go in the code?

Nellienellir answered 5/10, 2010 at 18:43 Comment(0)
D
118

It creates a hidden input on the form for the field (from your model) that you pass it.

It is useful for fields in your Model/ViewModel that you need to persist on the page and have passed back when another call is made but shouldn't be seen by the user.

Consider the following ViewModel class:

public class ViewModel
{
    public string Value { get; set; }
    public int Id { get; set; }
}

Now you want the edit page to store the ID but have it not be seen:

<% using(Html.BeginForm() { %>
    <%= Html.HiddenFor(model.Id) %><br />
    <%= Html.TextBoxFor(model.Value) %>
<% } %>

This results in the equivalent of the following HTML:

<form name="form1">
    <input type="hidden" name="Id">2</input>
    <input type="text" name="Value" value="Some Text" />
</form>
Delusive answered 5/10, 2010 at 18:43 Comment(11)
<%= Html.HiddenFor(model.Id) %><br /> in his example aboveArbor
I would say "seen" by the user. Users can "modify" anything they want to, hidden or not.Calif
@Craig - You're right. I actually though I changed that wording but apparently not.Delusive
And it's typically used for the ID (as in the example above), which you generally don't want to display.Unzip
I'm a bit confused because the view model isn't the controller's parameters. So why would the input's name be generated on the view model's fields?Barri
@Barri - The ViewModel isn't the Controller's parameters. It's the parameter that gets passed from the Controller (which constructs the ViewModel) to the View (which renders the model).Delusive
@JustinNiessner That's what I wrote, that it's not the controller's parameters. But the expression Html.HiddenFor(model.Id)'s result suggests it was. I just wrote a question about it here.Barri
Are there not security implications to exposing IDs?Diaconal
@Diaconal - If you've properly secured the rest of your application, no. Knowing the ID of an Entity should pose no danger.Delusive
I take your point - although exposing internal IDs - specially if they are not GUIDs - just seems a bit un-necessarily open?Diaconal
Just an FYI had I posted the same question today rather then googling it and finding it out somewhere else and it wasnt asked here before I would have been bashed to death. The double standards on this site is overwhelming.Apish
N
8

And to consume the hidden ID input back on your Edit action method:

[HttpPost]
public ActionResult Edit(FormCollection collection)
{
    ViewModel.ID = Convert.ToInt32(collection["ID"]);
}
Nevels answered 4/3, 2011 at 19:20 Comment(3)
Although this is technically true, you shouldn't have to do this if the form is strongly typed to a view model. You should be able to access the model directly, which removes the need to do any converting.Mortality
@Mortality : Incorrect. There is a good reason the scaffolding mechanism adds the ID field. Remove it from one of my tutorials and use Fiddler to see it's not in the post body.Unzip
I'm not sure how the comment is incorrect. If the Model is property For()'d in the view, the controller method should be strongly typed, and automatically populated by the ModelBinder.Vaivode
A
2

Like a lot of functions, this one can be used in many different ways to solve many different problems, I think of it as yet another tool in our toolbelts.

So far, the discussion has focused heavily on simply hiding an ID, but that is only one value, why not use it for lots of values! That is what I am doing, I use it to load up the values in a class only one view at a time, because html.beginform creates a new object and if your model object for that view already had some values passed to it, those values will be lost unless you provide a reference to those values in the beginform.

To see a great motivation for the html.hiddenfor, I recommend you see Passing data from a View to a Controller in .NET MVC - "@model" not highlighting

Airt answered 28/6, 2017 at 16:7 Comment(0)
N
0

The Use of Razor code @Html.Hidden or @Html.HiddenFor is similar to the following Html code

 <input type="hidden"/>

And also refer the following link

https://msdn.microsoft.com/en-us/library/system.web.mvc.html.inputextensions.hiddenfor(v=vs.118).aspx

Nickelsen answered 4/1, 2017 at 7:52 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.