O que Html.HiddenFor faz?

105

Embora eu tenha lido a documentação sobre Html.HiddenFor, não entendi para que é usado ...

Alguém poderia explicar seus usos e dar um pequeno exemplo?

Onde esses auxiliares devem ir no código?

JPCF
fonte

Respostas:

112

Ele cria uma entrada oculta no formulário para o campo (do seu modelo) que você passa.

É útil para campos em seu Model / ViewModel que você precisa para persistir na página e que foram devolvidos quando outra chamada é feita, mas não deveriam ser vistos pelo usuário.

Considere a seguinte classe ViewModel:

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

Agora você deseja que a página de edição armazene o ID, mas não seja visto:

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

Isso resulta no equivalente ao seguinte HTML:

<form name="form1">
    <input type="hidden" name="Id">2</input>
    <input type="text" name="Value" value="Some Text" />
</form>
Justin Niessner
fonte
<% = Html.HiddenFor (model.Id)%> <br /> em seu exemplo acima
Bryce Fischer,
11
Eu diria "visto" pelo usuário. Os usuários podem "modificar" o que quiserem, oculto ou não.
Craig Stuntz
@Craig - Você está certo. Na verdade, pensei ter mudado esse texto, mas aparentemente não.
Justin Niessner
E é normalmente usado para o ID (como no exemplo acima), que geralmente você não deseja exibir.
RickAndMSFT
Estou um pouco confuso porque o modelo de visualização não é os parâmetros do controlador. Então, por que o nome da entrada seria gerado nos campos do modelo de visualização?
João,
8

E para consumir a entrada de ID oculta de volta em seu método de ação Editar:

[HttpPost]
public ActionResult Edit(FormCollection collection)
{
    ViewModel.ID = Convert.ToInt32(collection["ID"]);
}
James Still
fonte
8
Embora isso seja tecnicamente verdade, você não deve ter que fazer isso se o formulário for fortemente tipado para um modelo de visualização. Você deve conseguir acessar o modelo diretamente, o que elimina a necessidade de fazer qualquer conversão.
Yetti
@Yetti: Incorreto. Há uma boa razão para o mecanismo de andaime adicionar o campo ID. Remova-o de um dos meus tutoriais e use o Fiddler para ver que não está no corpo da postagem.
RickAndMSFT
2
Não tenho certeza de como o comentário está incorreto. Se o modelo for propriedade For () 'd na visão, o método do controlador deve ser fortemente tipado e preenchido automaticamente pelo ModelBinder.
Erik Philips
2

Como muitas funções, esta pode ser usada de muitas maneiras diferentes para resolver muitos problemas diferentes. Eu penso nela como mais uma ferramenta em nossos cintos de ferramentas.

Até agora, a discussão se concentrou fortemente em simplesmente ocultar um ID, mas esse é apenas um valor, por que não usá-lo para muitos valores! Isso é o que estou fazendo, eu o uso para carregar os valores em uma classe apenas uma visão por vez, porque html.beginform cria um novo objeto e se seu objeto de modelo para essa visão já teve alguns valores passados ​​para ele, aqueles os valores serão perdidos, a menos que você forneça uma referência a esses valores no formulário inicial.

Para ver uma grande motivação para o html.hiddenfor, recomendo que você consulte Passando dados de uma visualização para um controlador em .NET MVC - "@model" sem destaque

Devin Andres Salemi
fonte