2011-02-24 22 views
5

अद्यतन: यदि आप जावास्क्रिप्ट में कम से कम एक ब्रेकपाइंट, कार्यों के लिए सत्यापन शुरू सेट है, लेकिन यह काम नहीं करता बिनाMVC 3 ग्राहक सत्यापन रुक-रुक कर काम करता है

अद्यतन: jQuery टैग जोड़ने के रूप में इस से जुड़ा हो सकता सत्यापन प्लगइन

मैं MVC 3 संस्करण, System.Web.Mvc उत्पाद संस्करण है: 3.0.20105.05th of Jan 2011 पर संशोधित - मुझे लगता है कि कि नवीनतम है।

मैं नोटिस कि ग्राहक सत्यापन काम नहीं कर रहा है क्योंकि यह आवेदन है कि हम पैदा कर रहे में लगता है, तो मैं एक त्वरित परीक्षण कर लिया है।

मैंने इंटरनेट एप्लिकेशन टेम्पलेट का उपयोग कर मूल एमवीसी 3 एप्लिकेशन बनाया है।

using System.Web.Mvc; 
using MvcApplication3.Models; 

namespace MvcApplication3.Controllers 
{ 
    public class TestController : Controller 
    { 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     public ActionResult Create() 
     { 
      Sample model = new Sample(); 

      return View(model); 
     } 

     [HttpPost] 
     public ActionResult Create(Sample model) 
     { 
      if(!ModelState.IsValid) 
      { 
       return View(); 
      } 

      return RedirectToAction("Display"); 
     } 

     public ActionResult Display() 
     { 
      Sample model = new Sample(); 
      model.Age = 10; 
      model.CardNumber = "1324234"; 
      model.Email = "[email protected]"; 
      model.Title = "hahah"; 

      return View(model); 
     } 
    } 
} 

मॉडल::

using System.ComponentModel.DataAnnotations; 

namespace MvcApplication3.Models 
{ 
    public class Sample 
    { 
     [Required] 
     public string Title { get; set; } 

     [Required] 
     public string Email { get; set; } 

     [Required] 
     [Range(4, 120, ErrorMessage = "Oi! Common!")] 
     public short Age { get; set; } 

     [Required] 
     public string CardNumber { get; set; } 
    } 
} 

और 3 बार देखे गए:

मैं टेस्ट नियंत्रक जोड़ दिया है

बनाएँ:

@model MvcApplication3.Models.Sample 

@{ 
    ViewBag.Title = "Create"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Create</h2> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@*@{ Html.EnableClientValidation(); }*@ 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(false) 
    <fieldset> 
     <legend>Sample</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Title) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Title) 
      @Html.ValidationMessageFor(model => model.Title) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Email) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Email) 
      @Html.ValidationMessageFor(model => model.Email) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Age) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Age) 
      @Html.ValidationMessageFor(model => model.Age) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.CardNumber) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.CardNumber) 
      @Html.ValidationMessageFor(model => model.CardNumber) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 

    @*<fieldset> 

     @Html.EditorForModel() 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 

    </fieldset> *@   
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

प्रदर्शन:

@model MvcApplication3.Models.Sample 

@{ 
    ViewBag.Title = "Display"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Display</h2> 

<fieldset> 
    <legend>Sample</legend> 

    <div class="display-label">Title</div> 
    <div class="display-field">@Model.Title</div> 

    <div class="display-label">Email</div> 
    <div class="display-field">@Model.Email</div> 

    <div class="display-label">Age</div> 
    <div class="display-field">@Model.Age</div> 

    <div class="display-label">CardNumber</div> 
    <div class="display-field">@Model.CardNumber</div> 
</fieldset> 
<p> 
    @Html.ActionLink("Back to List", "Index") 
</p> 

सूचकांक:

@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Index</h2> 

<p> 
    @Html.ActionLink("Create", "Create") 
</p> 

<p> 
    @Html.ActionLink("Display", "Display") 
</p> 

यहाँ सब कुछ डिफ़ॉल्ट है - बनाएं नियंत्रक, उचित पाड़ टेम्पलेट के साथ निर्दिष्ट नियंत्रक कार्रवाई से AddView मॉडल के साथ और नमूना आवेदन में प्रदान किए गए लेआउट का उपयोग कर।

जब मैं /टेस्ट/के लिए जाना जाएगा ज्यादातर मामलों में ग्राहक सत्यापन बनाएं केवल Title और Age क्षेत्रों के लिए काम करता है, यह सभी क्षेत्रों के लिए काम करता बनाएं क्लिक करने के बाद (नहीं बना सर्वर को जाता है)।

हालांकि कुछ मामलों में (निर्माण के बाद) Title सत्यापन काम कर रहा है नहीं और Email है, या CardNumber या Title और CardNumber लेकिन Email नहीं है। लेकिन कभी नहीं सभी मान्यता पर क्लिक बनाएं से पहले काम कर रहा है।

मैं Html.EditorForModel साथ फार्म के रूप में अच्छी तरह से लागू के रूप में ग्राहक सत्यापन बनाने की कोशिश की किया है, उसे BeginForm से पहले:

@{ Html.EnableClientValidation(); } 

मैं providing a source code for this sample on dropbox हूँ - के रूप में हो सकता है हमारे देव env टूट गया है:/मैं IE पर परीक्षण किया है 8 और क्रोम 10 बीटा।

शायद ज़रुरत पड़े, वेब config में मान्यता स्क्रिप्ट सक्षम हैं:

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

तो मेरे सवालों का

वहाँ सुनिश्चित करने के लिए के रूप में यह काम करने के लिए माना जाता है कि ग्राहकों का सत्यापन काम करेंगे एक रास्ता है कर रहे हैं और intermittently नहीं?

क्या यह वांछित व्यवहार है और मुझे कॉन्फ़िगरेशन/कार्यान्वयन में कुछ याद आ रहा है?

अद्यतन: यदि आप जावास्क्रिप्ट में कम से कम एक ब्रेकपाइंट, कार्यों के लिए सत्यापन शुरू, लेकिन बिना सेट यह काम नहीं करता

अद्यतन: jQuery टैग जोड़ने के रूप में इस मान्यता प्लगइन से जुड़ा हो सकता

+1

यह मेरे साथ भी हो रहा है ... इस पर कोई संकल्प ?? – cecilphillip

उत्तर

0

जब अविभाज्य सत्यापन का उपयोग किया जाता है - रीयलटाइम क्लाइंट-साइड सत्यापन केवल सबमिट करने के बाद ही काम करता है। फ़ॉर्म के पहले क्लाइंट-साइड सत्यापन को निष्पादित करने से पहले (बस सबमिट करें पर क्लिक करें) फ़ील्ड की रीयलटाइम सत्यापन प्रारंभ नहीं हुई है और काम नहीं कर रही है।

+0

yup, लेकिन कुछ फ़ील्ड के लिए रीयलटाइम सत्यापन सबमिट करने से पहले काम कर रहा है। कभी-कभी एक क्षेत्र होता है, कभी-कभी लगभग सभी फ़ील्ड, लेकिन कभी भी नहीं। – Gutek

+0

डाउनवोट क्योंकि यह सही है, यह मुद्दा नहीं है कि ओपी में – roo2

-1

दस्तावेज़ में अपनी स्क्रिप्ट संदर्भ <head> पर रखें। यह संभावना है कि स्क्रिप्ट निष्पादित होने पर एक समय मुद्दा है और सत्यापन को जोड़ दिया गया है।

+0

है, इससे थोड़ा सा मदद मिली। यह वास्तविक समय में काम नहीं करता है, लेकिन अगर मैं लंबे समय तक फॉर्म के साथ खेलूँगा और कभी-कभी टेक्स्ट फ़ील्ड में डबल बैकस्पेस करेगा, तो मैं सभी टेक्स्ट फ़ील्ड को सत्यापित करने के लिए मजबूर कर सकता हूं। लेकिन यह अभी भी इस मुद्दे को हल नहीं करता है, क्योंकि मुझे उपयोगकर्ता को सत्यापन जानकारी प्राप्त करने के लिए बहुत अधिक प्रयास करने की आवश्यकता है (बहुत अधिक प्रयास - क्लिकिंग, टैबबिंग, डबल बैकस्पेस, जब तक यह ट्रिगर नहीं हो जाता है - मूल रूप से मुझे फ़ील्ड में प्रवेश करने और जोड़ने की आवश्यकता होती है/ में स्क्रिप्ट के साथ ट्रिगर करने के लिए टेक्स्ट गुणा करें गुणा करें)। – Gutek

+0

क्लाइंट सत्यापन jquery सत्यापन प्लगइन पर आधारित है। यह व्यवहार डिज़ाइन द्वारा है - "किसी फ़ील्ड को अमान्य के रूप में चिह्नित करने से पहले, सत्यापन आलसी है: फ़ॉर्म को पहली बार सबमिट करने से पहले, उपयोगकर्ता परेशान संदेशों के बिना फ़ील्ड के माध्यम से टैब कर सकता है - उसे पहले से बग नहीं मिलेगा वास्तव में एक सही मूल्य दर्ज करने का मौका "- http://docs.jquery.com/Plugins/validation। जमा करने पर क्लिक करने पर यह सही तरीके से काम कर रहा है सत्यापन का कारण बनता है। – hwiechers

+0

ठीक है, लेकिन शुरुआत में कुछ क्षेत्रों के लिए क्यों काम कर रहा है? अर्थात। उम्र के लिए यह हमेशा सबमिट करने से पहले काम करता है और उपयोगकर्ताओं को सत्यापन त्रुटि के बारे में संदेश मिलता है। यह शेष क्षेत्रों के लिए भी एक मामला है, लेकिन यह हमेशा फ़ील्ड के उसी सेट के लिए काम नहीं करता है - कभी-कभी यह केवल सबमिट करने से पहले आयु के लिए ही काम करता है और कभी-कभी यह सबमिट करने से पहले शीर्षक और आयु के लिए काम करता है। और यह सभी फ़ील्ड के लिए काम करता है यदि आप जेएस में ब्रेक पॉइंट सेट करेंगे उदाहरण के लिए फायरबग। इसे इस तरह काम नहीं करना चाहिए - अगर इसे प्रस्तुत करने से पहले काम नहीं करना चाहिए - लेकिन यह काम करता है। जो उपयोगकर्ताओं के लिए भ्रमित है – Gutek

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