2011-07-06 26 views
5

ASP.NET MVC 3 kullanıyorum ve Görünüm Modelinin çoğunluğunun salt okunur olduğu birkaç sayfaya sahibim. Bir örnek alan böyle gibi olacaktır:ASP.NET MVC 3 - Kullanım için en iyi yöntem Model görünümünde

<div class="display-label">My Field</div> 
<div class="display-field">@Model.MyField</div> 

Sonra kullanıcı yüzden gibi bazı doğrulama metnini tuşlamalıdır bir alan var: o vurur kullanıcı formu gönderdiğinde

@Html.LabelFor(model => model.Verification) 
@Html.PasswordFor(model => model.Verification) 

ve benim denetleyici, Doğrulama alanı dışındaki ViewModel'in alanları boştur.

@Html.HiddenFor(model => model.MyField) 

Ancak bu gerçekten hızlı çirkin alır: Bu etrafında aldık yolu, şimdiye kadar böyle gibi çeşitli HiddenFor alanlara sahip olmaktır. Modelin görünüm durumunda ele alınmasının daha iyi bir yolu var, bu yüzden form gönderiminde POST sırasında tüm alanlarımı alabilir miyim? Doğrulama metninin POST sırasında eşleşmemesi ve görüntü modelini veritabanından yeniden almadan yeniden döndürmem gerekiyorsa bu önemlidir.

Önerileriniz için teşekkür ederiz.

cevap

3

Veritabanından değeri yeniden almadan, daha iyi bir yolu yoktur. Bunun nedeni, MVC'nin modelinin bağlamasının yalnızca eylemin modeline MyField kodunu bağlamak için GET veya POST parametrelerine bakması ve GET/POST parametrelerinin MyField değerine sahip olmaması durumunda, bu özelliğin null olarak kalması gerekir değeri ne olmalıdır bilecek mi?)

Model bağlayıcınızın MyField değerinizi görebilmesi için GET/POST parametrelerini geçmesi ve bunu yapmak için görünümünüzü açıkça belirtmeniz gerekir. değeri Html.HiddenFor() aracılığıyla iletin. Görünümün, post/get parametrelerinde bu özelliği göndermeyi otomatik olarak bilmesinin bir yolu yoktur.

Ancak bakabilirsiniz bir fikri bir alan adı ve bir ifade (x => x.MyField) götüren bir Jilet (veya Html) yardımcı yöntem oluşturmaktır ve sizin için aşağıdaki çıktıyı yazıyor:

<div class="display-label">My Field</div> 
<div class="display-field">@Model.MyField</div> 
@Html.HiddenFor(model => model.MyField) 
.

Bu, yalnızca bir kod satırı yerine o 3 hatlarının @Html.ShowReadOnlyField(x => x.MyField, "My Field") gibi (bir şey yazmak zorunda anlamına Ancak bu da varsayar aynı div yapıya sahip olacaktır bunu yapmak istiyor her yerde

Düzenleme. Jus Salt okunur alanlar ile ilgili güvenlik endişelerini aklınızdan çıkarmayın, çünkü bunlar gerçekten salt okunur değildir. Bu veriler kontrolördeki herhangi bir şey için kullanılacaksa, veri tabanından bu verileri yeniden almak daha iyidir. çünkü sadece HTML formunda okunmasına rağmen, kullanıcılar bu değeri POST/GET verilerini işleyerek istedikleri herhangi bir şeye ayarlayabilirler.

+0

Güvenlik endişelerini '@ Html.AntiForgeryToken() 'yardımcı programını kullanarak bulabilecek misiniz? – Brandon

+1

Bundan şüpheliyim. AntiForgeryToken işlevselliği hakkında fazla bir şey bilmiyorum, ancak büyük olasılıkla kullanıcı, çalışmasının yapabilmesi için ne tür bir belirtecin olduğunu görmek için sayfanın kaynağına bakabilir. Sahtecilik belirteci, siteler arası komut dosyası saldırıları için daha fazla değer koruması için değil, ve bir alanın sağlanmasının sağlanıp sağlanmadığını bilmek için bir yol var.Güvenli olması gereken herhangi bir şey sunucu tarafında ele alınmalıdır ve güvenlik için – KallDrexx

+0

istemci tarafı özelliklerine güvenemezsiniz. Sadece nesne örneğimi denetleyiciye yeniden yükledim. – Brandon

0

Lütfen Modeli Sayfada serileştirmeyi ve sonra bir Posta mı yapmayı deneyin? Bu Sorunu Çözmeli.

<%= Html.Serialize("User",Model) %> 

[HttpPost] 
public ActionResult Register([DeserializeAttribute] User user, FormCollection userForm) 
{ 

} 
+0

Merhaba ViewState! –