Html.HiddenFor ne yapar?


105

Html.HiddenFor'daki dokümantasyonu okumama rağmen, ne için kullanıldığını anlamadım ...

Biri bunun kullanımlarını açıklayabilir ve kısa bir örnek verebilir mi?

Bu yardımcılar kodun neresine girmeli?

Yanıtlar:


112

Geçtiğiniz alan için (modelinizden) form üzerinde gizli bir girdi oluşturur.

Model / ViewModel'inizdeki, sayfada kalmanız gereken ve başka bir arama yapıldığında geri dönmeniz gereken ancak kullanıcı tarafından görülmemesi gereken alanlar için kullanışlıdır.

Aşağıdaki ViewModel sınıfını göz önünde bulundurun:

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

Şimdi, düzenleme sayfasının kimliği saklamasını, ancak görünmemesini istiyorsunuz:

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

Bu, aşağıdaki HTML'nin eşdeğeriyle sonuçlanır:

<form name="form1">
    <input type="hidden" name="Id">2</input>
    <input type="text" name="Value" value="Some Text" />
</form>

<% = Html.HiddenFor (model.Id)%> <br /> yukarıdaki örneğinde
Bryce Fischer

11
Kullanıcı tarafından "görüldü" derdim. Kullanıcılar gizli olsun ya da olmasın istedikleri her şeyi "değiştirebilirler".
Craig Stuntz

@Craig - Haklısın. Aslında bu ifadeyi değiştirmiş olsam da görünüşe göre değiştirmedim.
Justin Niessner

Ve genellikle (yukarıdaki örnekte olduğu gibi), genellikle görüntülemek istemediğiniz kimlik için kullanılır.
RickAndMSFT

Biraz kafam karıştı çünkü görünüm modeli denetleyicinin parametreleri değil. Öyleyse neden girdinin adı görünüm modelinin alanlarında üretilecek?
John

8

Ve gizli kimlik girişini Düzenle eylem yönteminize geri almak için:

[HttpPost]
public ActionResult Edit(FormCollection collection)
{
    ViewModel.ID = Convert.ToInt32(collection["ID"]);
}

8
Bu teknik olarak doğru olsa da, form bir görünüm modeline güçlü bir şekilde yazıldıysa bunu yapmanız gerekmez. Modele doğrudan erişebilmeniz gerekir, bu da herhangi bir dönüştürme yapma ihtiyacını ortadan kaldırır.
Yetti

@Yetti: Yanlış. İskele mekanizmasının kimlik alanını eklemesinin iyi bir nedeni vardır. Öğreticilerimden birinden çıkarın ve posta gövdesinde olmadığını görmek için Fiddler'ı kullanın.
RickAndMSFT

2
Yorumun ne kadar yanlış olduğundan emin değilim. Model, görünümde For () 'd özelliği ise , denetleyici yöntemi güçlü bir şekilde yazılmalı ve ModelBinder tarafından otomatik olarak doldurulmalıdır.
Erik Philips

2

Pek çok işlev gibi, bu da birçok farklı sorunu çözmek için birçok farklı şekilde kullanılabilir, bunu alet kemerlerimizdeki başka bir araç olarak düşünüyorum.

Şimdiye kadar, tartışma ağırlıklı olarak bir kimliği gizlemeye odaklandı, ancak bu yalnızca bir değer, neden onu birçok değer için kullanmayalım! Yaptığım şey bu, bir sınıftaki değerleri bir seferde yalnızca bir görünümde yüklemek için kullanıyorum, çünkü html.beginform yeni bir nesne oluşturuyor ve bu görünüm için model nesneniz zaten ona geçirilen bazı değerlere sahipse, bunlar başlangıç ​​formunda bu değerlere bir referans sağlamazsanız değerler kaybolacaktır.

Html.hiddenfor için harika bir motivasyon görmek için, .NET MVC'de bir Görünümden Denetleyiciye veri aktarımı - "@model" seçeneğinin vurgulanmadığını görmenizi öneririm


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.