2011-04-01 22 views
6

JQuery unobtrusive validation ile asp.net mvc 3 kullanıyorum. Kısa bir süre önce standart DataAnnotations'dan FluentValidation'a geçtim ve harika çalışıyor.mvc clientide doğrulaması

FluentValidation'ı almamdaki temel nedenim, viewmodel'de iç içe geçmiş özellikleri doğrulamak gerektiğiydi (ancak bunu kullanmanın başka nedenleri olduğunu buldum), bu tür bir şeye benziyor (erişimcilerin bunun sahte olduğunu düşünmeyin): FluentValidation kullanma

class Vm { 
    string Prop; 
    string AnotherProp; 
    IEnumerable<ElementsVm> Elements; 
} 

class ElementsVm { 
    bool Required; 
    string Id; 
    string Title; 
    string Value; 
} 

Ben ElementVm Vm için ve bir doğrulayıcı yapmak ve benim birim testleri bana doğrulama çalışıyor sunucu tarafı gösteren yeşildir.

İstemci tarafı, 'Prop' ve 'AnotherProp' çalışıyor - doğrulama kuralım da istemci tarafını beklendiği gibi çalışıyor (DataAnnontation ile olduğu gibi), ancak tüm Elemanlarım istemci tarafında doğrulama almıyor - domu incelerim ve tüm veriye, veriye ihtiyaç duyulan vb. özniteliklerin eksik olduğunu görebiliyorum.

Görünümlerimde html oluşturmak için farklı yaklaşımlar denedim, ancak öğelerim bir kısmi olarak oluşturulurken, 'Prop' ve 'AnotherProp' öğeleri Html.TextBoxFor (m => m.Prop) kullanılarak oluşturulur. Sorunların başladığı yer burası. Html.TextBoxFor (m => m.Value) seçeneğini seçtiğimde tüm Eleman Metin Kutularım aynı ada sahip olacaklardır, bu yüzden aynı zamanda benzersiz bir kimlik/ad oluşturmak için Html.TextBox (Model.Id) kullanmayı denedim, ancak yine de hiçbir doğrulama özelliği kullanamadım. .

Bu yüzden senario'yu çalıştırmanın bir yolu var - bunu yeniden yazmayı umursamıyorum, ama FluentValidation'ın benim için htmlimi yazmasını gerçekten çok isterim.

Yedek çözümüm kendi HTML yardımcılarımın özelliklerle doğru Html oluşturmasını sağlamak olurdu, ancak bence bu da benim için akıcı olacaktı, çünkü FluentValidation'a yeni sürümler/yamalar verildiğinde bu yardımcıları güncellemeye devam etmeliyim. jQuery validasyonu veya ikisi arasında mvc bağlantısı.

var i = 0; 
foreach (var element in Model) 
{ 
    ViewData.TemplateInfo.HtmlFieldPrefix = "Elements[" + i.ToString() + "]"; 
    @Html.TextBoxFor(m => m.Value) 
    i++; 
} 

Bu mütevazi doğrulama özelliklerini size vermeli ve ayrıca çalışması gerekir: En kısmi olarak

cevap

8

, ElementsVM her örneği önce, bunu gibi ViewData.TemplateInfo.HtmlFieldPrefix kullanarak eşsiz önek ayarlamalısınız varsayılan model bağlayıcı ile.

counsellorben

+0

Teşekkürler! Bu çalışır ve cevap olarak işaretlenmelidir. – JustinP8

+1

Ayrıca, döngüden sonra girişleriniz varsa 'ViewData.TemplateInfo.HtmlFieldPrefix =" "' sıfırlamayı da unutmayın. – JustinP8

+0

@ JustinP8, @counsellorben, @Per: Aynı problemi yaşıyorum ama bu düzeltmedi. İç içe geçmiş koleksiyonum için EditorTemplates kullanıyorum ve tüm 'input' etiketlerinin 'id' öznitelikleri zaten öntanımlı/eşdeğerli "Elements [0]" ile önekli. 'ViewData.TemplateInfo.HtmlFieldPrefix' bilmek yararlı, ama benim için sorun değil. @Per, 'data-val, data-required vb. Özniteliklerin eksik olduğunu' belirtti. Ben de aynı şeyi fark ettim. – tkerwood

İlgili konular