Cevaplar çok iyi ama MVC ve .NET'in son sürümünde "eski okul" FormCollection ve Request anahtarları yerine kullanmayı gerçekten sevdiğim başka bir yol var.
AJAX veya FORM POST'u yapan bir form etiketinde bulunan bir HTML pasajını düşünün.
<input type="hidden" name="TrackingID"
<input type="text" name="FirstName" id="firstnametext" />
<input type="checkbox" name="IsLegal" value="Do you accept terms and conditions?" />
Denetleyiciniz aslında form verilerini ayrıştıracak ve size tanımlı tipin parametreleri olarak teslim etmeye çalışacaktır. Yanıltıcı olduğu için onay kutusunu ekledim. İşaretliyse "açık" ve işaretlenmemişse null döndürür. Gerçi gereksinim, bu tanımlanmış değişkenlerin var olması ZORUNLUDUR (null yapılamazsa ( string
bunun null yapılabilir olduğunu unutmayın ), aksi takdirde AJAX veya POST geri başarısız olur.
[HttpPost]
public ActionResult PostBack(int TrackingID, string FirstName, string IsLegal){
MyData.SaveRequest(TrackingID,FirstName, IsLegal == null ? false : true);
}
Ayrıca herhangi bir jilet yardımcısı kullanmadan bir modeli geri gönderebilirsiniz. Bazen buna ihtiyaç duyulduğunu gördüm.
public Class HomeModel
{
public int HouseNumber { get; set; }
public string StreetAddress { get; set; }
}
HTML işaretlemesi basitçe ...
<input type="text" name="variableName.HouseNumber" id="whateverid" >
ve denetleyiciniz (Razor Engine) Form Değişkeni "değişkenAdı" nı keser (ad istediğiniz gibi olur ancak tutarlı olmasını sağlar) ve onu oluşturmaya ve MyModel'e atmaya çalışır.
[HttpPost]
public ActionResult PostBack(HomeModel variableName){
postBack.HouseNumber; //The value user entered
postBack.StreetAddress; //the default value of NULL.
}
Bir denetleyici bir Model beklerken (bu durumda HomeModel), ayrıştırıcı onları varsayılan olarak, genellikle NULL olarak bırakacağından, TÜM alanları tanımlamanız gerekmez. İşin güzel yanı, Mark-up'ta çeşitli modelleri karıştırıp eşleştirebilmeniz ve geri ayrıştırma sonrası mümkün olduğunca doldurulacak olmasıdır. Sayfada bir model tanımlamanıza veya herhangi bir yardımcı kullanmanıza gerek yoktur.
İPUCU: Denetleyicideki parametrenin adı, HTML biçimlendirmesinde "name =" tanımlanan addır Model adı değil, ancak! İçindeki beklenen değişkenin adıdır!
Kullanımı List<>
, biçimlendirmede biraz daha karmaşıktır.
<input type="text" name="variableNameHere[0].HouseNumber" id="id" value="0">
<input type="text" name="variableNameHere[1].HouseNumber" id="whateverid-x" value="1">
<input type="text" name="variableNameHere[2].HouseNumber" value="2">
<input type="text" name="variableNameHere[3].HouseNumber" id="whateverid22" value="3">
<> Listesindeki Dizin her zaman sıfır tabanlı ve sıralı OLMALIDIR. 0,1,2,3.
[HttpPost]
public ActionResult PostBack(List<HomeModel> variableNameHere){
int counter = MyHomes.Count()
foreach(var home in MyHomes)
{ ... }
}
Kullanma IEnumerable<>
olmayan sıfır göre olan ve olmayan ardışık indeksleri geri göndermek. Bağlayıcıya yardımcı olmak için fazladan gizli bir girdi eklememiz gerekiyor.
<input type="hidden" name="variableNameHere.Index" value="278">
<input type="text" name="variableNameHere[278].HouseNumber" id="id" value="3">
<input type="hidden" name="variableNameHere.Index" value="99976">
<input type="text" name="variableNameHere[99976].HouseNumber" id="id3" value="4">
<input type="hidden" name="variableNameHere.Index" value="777">
<input type="text" name="variableNameHere[777].HouseNumber" id="id23" value="5">
Ve kodun sadece IEnumerable'ı kullanması ve ToList()
[HttpPost]
public ActionResult PostBack(IEnumerable<MyModel> variableNameHere){
int counter = variableNameHere.ToList().Count()
foreach(var home in variableNameHere)
{ ... }
}
Sayfa başına tek bir Model veya bir ViewModel (karmaşık bir 'Görünüm' Modeli oluşturmak için diğer modelleri içeren Model) kullanılması önerilir. Önerilen şekilde karıştırma ve eşleştirme kötü uygulama olarak kabul edilebilir, ancak çalıştığı ve okunabilir olduğu sürece KÖTÜ değildir. Bununla birlikte, Razor motorunun gücünü ve esnekliğini gösterir.
Bu nedenle, rastgele bir şeyi bırakmanız veya bir Razor yardımcısından başka bir değeri geçersiz kılmanız gerekiyorsa veya sıradışı bazı veri kombinasyonlarını kullanan tek bir form için kendi yardımcılarınızı yapmak istemiyorsanız, bu yöntemleri hızlı bir şekilde kullanarak ekstra veri.