2011-04-01 15 views
6

मैं jquery unobtrusive सत्यापन के साथ asp.net mvc 3 का उपयोग कर रहा हूं। मैंने हाल ही में मानक डेटा एनाटेशन से फ्लुएंट वैलिडेशन में बदल दिया है और यह बहुत अच्छा काम करता है।नेस्टेड (संग्रह) गुणों के लिए एमवीसी क्लाइंटसाइड सत्यापन

FluentValidation को चुनने का मेरा प्राथमिक कारण मेरे व्यूमोडेल पर नेस्टेड गुणों को सत्यापित करने की आवश्यकता थी (लेकिन मुझे लगता है कि इसका उपयोग करने के लिए अन्य अच्छे कारण हैं) कि ऐसा लगता है (यह एक्सेसर्स को यह छद्म नहीं है):

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

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

FluentValidation का उपयोग करते हुए मैं Vm के लिए और के लिए ElementVm एक सत्यापनकर्ता बनाने के लिए और मेरी इकाई परीक्षण हरे हैं, मुझे सर्वर साइड सत्यापन काम कर रहा है दिखा।

ग्राहक पक्ष, 'प्रोप' और 'एक औरप्रॉप' काम कर रहा है - मेरे सत्यापन नियम अपेक्षाकृत क्लाइंट-साइड चला रहे हैं (जैसा कि वे डेटाअनोटेशन के साथ होंगे), लेकिन मेरे सभी तत्वों को क्लाइंट-साइड सत्यापन नहीं मिल रहा है - मैं डोम का निरीक्षण करता हूं और सभी डेटा-वैल, डेटा-आवश्यक इत्यादि देख सकता हूं। विशेषताएं गायब हैं।

मैंने अपने विचारों में एचटीएमएल उत्पन्न करने के लिए विभिन्न दृष्टिकोणों का प्रयास किया है, लेकिन 'प्रोप' और 'अन्यप्रॉप' एचटीएमएल। टेक्स्टबॉक्स फोर (एम => एम.प्रॉप) का उपयोग करके उत्पन्न होते हैं जबकि मेरे तत्व आंशिक रूप से उत्पन्न होते हैं - यह वह जगह है जहां समस्याएं शुरू होती हैं। अगर मैं Html.TextBoxFor (m => m.Value) चुनता हूं तो मेरे सभी एलिमेंट टेक्स्टबॉक्स में एक ही नाम/आईडी होगा, इसलिए मैंने अद्वितीय आईडी/नाम उत्पन्न करने के लिए Html.TextBox (Model.Id) का उपयोग करने का भी प्रयास किया लेकिन अभी भी कोई सत्यापन गुण नहीं है ।

तो मेरा सेनारियो काम करने का कोई तरीका है - मुझे थोड़ा सा लिखना बुरा नहीं लगता है, लेकिन मुझे वास्तव में फ्लुएंट वैलिडेशन पसंद है जो मेरे लिए मेरे एचटीएमएल लिखने के लिए है।

मेरा फॉलबैक समाधान मेरे एचटीएमएल हेल्पर्स को गुणों के साथ सही एचटीएमएल उत्पन्न करने के लिए बनाना होगा, लेकिन मुझे लगता है कि मुझे लगता है कि चूंकि मुझे उन सहायकों को अपडेट करना होगा, जब नए रिलीज/पैच को फ्लुएंट वैलिडेशन में बनाया गया था, jquery सत्यापन या दोनों के बीच एमवीसी में लिंक।

उत्तर

8

अपने आंशिक रूप से, ElementsVM के प्रत्येक उदाहरण से पहले, आप ViewData.TemplateInfo.HtmlFieldPrefix का उपयोग कर एक अनूठा उपसर्ग, सेट करना होगा तो जैसे:

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

यह आपके विनीत सत्यापन का श्रेय आप देना चाहिए, और भी काम करना चाहिए डिफ़ॉल्ट मॉडल बांधने की मशीन के साथ।

काउंसेलोरबेन

+0

धन्यवाद! यह काम करता है, और जवाब के रूप में चिह्नित किया जाना चाहिए। – JustinP8

+1

इसके अलावा, यदि आप लूप के बाद इनपुट करते हैं तो 'ViewData.TemplateInfo.HtmlFieldPrefix = "" रीसेट करना न भूलें। – JustinP8

+0

@ जस्टिनपी 8, @ कौन्ससेलोरबेन, @Per: मुझे एक ही समस्या है, लेकिन इससे इसे ठीक नहीं किया गया। मैं अपने नेस्टेड संग्रह के लिए EditorTemplates का उपयोग कर रहा हूं और सभी 'इनपुट' टैग की 'आईडी' विशेषताएं पहले से ही उचित/समकक्ष "तत्व [0]" के साथ पहले से तय की गई हैं। 'ViewData.TemplateInfo.HtmlFieldPrefix' जानना आसान है, लेकिन मेरे लिए मुद्दा नहीं है। @Per ने उल्लेख किया कि 'डेटा-वैल, डेटा-आवश्यक आदि विशेषताएँ गायब हैं'। मैंने वही बात देखी है। – tkerwood

संबंधित मुद्दे