8

उत्सर्जित नहीं करता है मैंने एक एमवीसी 3 एप्लिकेशन में आंशिक दृश्य बनाया है। यह दृश्य इस तरह एक जोरदार टाइप किया मॉडल हैं:एएसपी.नेट एमवीसी पार्टियल व्यू सत्यापन मार्कअप

public class ProductViewModel 
{ 
    [Required, Display(Name = "Product price")] 
    public decimal? ProductPrice 
    { 
     get; 

     set; 
    } ... 
} 

मेरी कार्रवाई विधि में मैं इस

PartialView("ProductViewModel", products[0]); 

तरह PartialView विधि आह्वान लेकिन पृष्ठ पर मैं मान्यता तर्क के लिए किसी भी मार्कअप नहीं देख सकते हैं लेकिन और पृष्ठ पर कोई त्रुटि होने पर कुछ भी नहीं होता है। यदि मैं इस आंशिक दृश्य को एक संपादक टेम्पलेट के रूप में उपयोग करता हूं, तो यह काम करता है। किसी भी मदद की सराहना की है।

संपादित करें: अधिक विशिष्ट होने के लिए मेरे पास एक HTML फॉर्म है और मैं AJAX अद्यतन के माध्यम से इसे मार्कअप जोड़ना चाहता हूं (यदि कोई उपयोगकर्ता बटन पर क्लिक करता है, तो मैं उस फ़ॉर्म में नया मार्कअप जोड़ना चाहता हूं)। यदि मैं उन नियंत्रणों को स्थिर रूप से शामिल करता हूं, तो मेरा मतलब है कि यदि पृष्ठ लोड हो जाता है तो मैं उन्हें प्रस्तुत करता हूं, सत्यापन कार्य करता है लेकिन यदि मैं उस फ़ॉर्म में एजेक्स कॉल द्वारा नियंत्रण जोड़ता हूं, तो उन नियंत्रणों के लिए कोई सत्यापन मार्कअप डाला नहीं जाता है। मेरे आंशिक दृश्य इस तरह दिखता है:

@Html.LabelFor(x => x.ProductPrice) 

@Html.TextBoxFor(x => x.ProductPrice) 

@Html.ValidationMessageFor(x => x.ProductPrice) 

मेरे प्रपत्र इस तरह दिखता है:

@using (Html.BeginForm()) 
{ 
    <div id="div_Products"> 
     @Html.EditorFor(x => x) 
    </div> 

    <input type="submit" value="Compare" /> 
} 

कोड ऊपर अच्छी तरह से काम करता है, मान्यता काम करता है।

[HttpPost] 
public ActionResult InsertProduct() 
{ 
    var newProductVM = new ProductViewModel{ ProductPrice = 789 }; 

    return PartialView("~/Views/Nutrition/EditorTemplates/ProductViewModel.cshtml", newProductVM); 
} 

मैं पता लगा कि MVC इंजन केवल अगर यह पता चलता है कि नियंत्रण एक रूप नियंत्रण के अंदर हैं उन सत्यापन मार्कअप सम्मिलित करता है: सर्वर साइड पर मैं एक कार्य विधि है कि लगता है कि आह्वान। जब मैं एजेक्स कॉल के माध्यम से अपना फॉर्म कंट्रोल अपडेट करने का प्रयास करता हूं, तो एमवीसी को यह जानने का कोई तरीका नहीं है कि उन्हें एक फॉर्म तत्व के अंदर रखा जाएगा और यही कारण है कि यह उनके लिए कोई सत्यापन तर्क नहीं छोड़ता है, मुझे लगता है।

+0

यह समझ में आता है कि एक संपादक "उत्सर्जन" सत्यापन त्रुटियों और ऐसे में, और यह एक दृश्य नहीं करता है। क्या हम आपके विचार के लिए कोड देख सकते हैं? – rfmodulator

+0

समस्या यह है कि एमवीसी केवल सत्यापन चिह्न को सम्मिलित करता है अगर यह पता चलता है कि नियंत्रण एक रूप के अंदर हैं। समस्या यह है कि मैं AJAX अद्यतन के माध्यम से एक फॉर्म नियंत्रण में मार्कअप जोड़ना चाहता हूं लेकिन इस तरह एमवीसी इंजन यह नहीं जानता कि यह मार्कअप एक फॉर्म तत्व में डाला जाएगा और इसलिए यह किसी भी सत्यापन मार्कअप को उत्सर्जित नहीं करता है। – Zoliqa

+0

आप इसे कुछ HTML.ValidationMessageFor() कोड के साथ मजबूर कर सकते हैं। जैसे मैंने कहा, कृपया हमें अपना विचार दिखाएं। – rfmodulator

उत्तर

1

क्या आपने web.config या दृश्य में अनजान सत्यापन सक्षम किया है?

web.config में

:

<configuration> 
    <appSettings> 
     <add key="ClientValidationEnabled" value="true"/> 
     <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
    </appSettings> 
</configuration> 

या अंदर कोड:

HtmlHelper.ClientValidationEnabled = true; 
HtmlHelper.UnobtrusiveJavaScriptEnabled = true; 
+0

उनकी सत्यापन संपादक में सही तरीके से काम करती है, इसलिए यह हमें बताती है कि कॉन्फ़िगरेशन सही है। – rfmodulator

2

अपने आंशिक दृश्य में, यह (सी #/उस्तरा) जोड़ें:

@Html.ValidationMessageFor(model => model.ProductPrice) 
0

ग्राहक सत्यापन का उपयोग करना , पेज लोड के बाद लोड किए गए तत्वों को दोबारा सत्यापित करना संभव है। चूंकि एमवीसी अब jQuery सत्यापन का उपयोग करता है, अगर आपके पास क्लाइंट सत्यापन सक्षम है;

jquery validate - validating a field on pageload

यह आपकी मदद कर सकता है।

if (this.ViewContext.FormContext == null) 
{ 
    this.ViewContext.FormContext = new FormContext(); 
} 

आप प्रपत्र फ़ील्ड्स जोड़ने के लिए ajax का उपयोग कर रहे हैं, तो आप करने के लिए नए क्षेत्रों को गति प्रदान कर सकते हैं:

10

अपने आंशिक दृश्य के शीर्ष में रखें यह और आप html उत्पादन में गाया सत्यापन संदेश प्राप्त होगा , सत्यापन में जुड़ती एक बार वे की तरह कुछ का उपयोग कर डोम/पृष्ठ से जुड़ चुके हैं:

$("form").removeData("validator"); 
$("form").removeData("unobtrusiveValidation"); 
$.validator.unobtrusive.parse("form"); 

संपादित करें/अद्यतन (23 फेड 2013): मैं बस के लिए एक आंशिक देखने के FormContext हैक कर लिया गया है विजुअल स्टूडियो 2012 में पहली बार ऐसा लगता है jQuery और सत्यापन आदि के नवीनतम संस्करणों के साथ मुझे AJAX पर गतिशील रूप से काम करने के सत्यापन के लिए जावास्क्रिप्ट (उपरोक्त) की 3 पंक्तियां जोड़ने की आवश्यकता नहीं है जो बहुत अच्छा है!

+0

यह काम किया, लेकिन मुझे यकीन नहीं है कि मैं क्यों समझता हूं। –

+0

@ChrisJackson - अच्छी तरह से, उच्च स्तर के ब्लैक-बॉक्स परिप्रेक्ष्य से पूरी तरह से समस्या को देखते हुए, यह कहना उचित होगा कि Html.ValidationMessageFor एक गैर-शून्य फॉर्मकॉन्टेक्स्ट की तलाश करता है - जिसे आमतौर पर उपयोग करने जैसे कुछ का उपयोग करके सेट किया जाएगा (Html.BeginForm) {- और यदि यह एक नहीं मिलता है तो यह सत्यापन संदेशों को प्रस्तुत करने से परेशान नहीं करता है। मेरा अनुमान है कि जेएस सत्यापन के लिए सही तरीके से कार्य करने के लिए एक फॉर्म की आवश्यकता होती है, इसलिए सत्यापन संदेश होने का कोई मतलब नहीं है। आईएमओ यह नेट टीम द्वारा एक निरीक्षण है। – Rob

+1

@ रोब, धन्यवाद, यह मेरे सिरदर्द ठीक हो गया! – Netricity

2

सुनिश्चित नहीं हैं कि अगर यह अभी भी आप के लिए एक समस्या है, लेकिन समाधान कॉल करने के लिए होगा:

$.validator.unobtrusive.parse($('#your-new-form-div')); 

के बाद आप AJAX के माध्यम से फार्म मार्कअप/नियंत्रण लोड किया है। यह आपके नए फॉर्म तत्वों को पार करता है और आपके दृश्य में निर्दिष्ट क्लाइंटसाइड सत्यापन बनाता है।

+0

चाहे वह उसके लिए कोई समस्या हो या नहीं, यह मेरे लिए एक समस्या थी। मैं interwebz की गहराई के चारों ओर उछाल रहा हूं, जो इस बात की तलाश में है, यह जानकर कि यह सत्यापन को पुनः प्राप्त करने के बारे में कुछ होने जा रहा था। मेरा एकमात्र अफसोस यह है कि मेरे पास देने के लिए एक अपवित्र है। धन्यवाद, दयालु महोदय, क्योंकि अब मैं इस ईंट की दीवार में पहले सिर को दौड़ना बंद कर सकता हूं जो मेरे खून के कई पिंटों से रंगा हुआ है। ओह, मैंने $ ('# my-new-form-div') नहीं कहा, मैंने $ ('फॉर्म') कहा और यह अभी भी काम करता है। FYI करें। – vbullinger

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