2012-12-13 19 views
5

ब्रीज़ पर देखकर मैं अपनी कई विशेषताओं से प्रभावित हूं।ब्रीज़ सर्वर-साइड प्रमाणीकरण

मुझे यह समझने में परेशानी हो रही है कि क्लाइंट को सर्वर-साइड DbContext सत्यापन त्रुटियों को वापस कैसे प्राप्त करें। मैं समझता हूं कि ब्रीज़ में डिफ़ॉल्ट सत्यापनकर्ता हैं जो "आवश्यक" जैसे कुछ विशेषताओं पर प्रतिक्रिया करते हैं, लेकिन अन्य सभी विशेषताओं के बारे में क्या? मैं ब्रीज़ के लिए एक कस्टम जावास्क्रिप्ट सत्यापनकर्ता लिख ​​सकता हूं जो क्लाइंट साइड पर जांच करेगा, लेकिन मुझे यह सुनिश्चित करने के लिए भी जांच करनी होगी कि इकाई सर्वर-साइड पर मान्य है।

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

नीचे दिए गए मॉडल को मानते हुए, किसी भी इकाई सत्यापन त्रुटियों को प्राप्त करने का सबसे अच्छा तरीका क्या होगा?

public class PeopleContext : DbContext 
{ 
    public PeopleContext() 
     : base("name=ConnectionString"){ } 

    public DbSet<Person> People { get; set; } 
} 

public class Person 
{ 
    public int PersonId { get; set; } 
    public string FirstName { get; set; } 
    [Required] 
    public string LastName { get; set; } 
    [EmailAddress] 
    [Required] 
    public string Email { get; set; } 
} 

अद्यतन 1:

यहाँ कुछ निर्देशों के मुद्दा यह है कि मैं का सामना कर रहा हूँ फिर से बनाने हैं।

  1. "तोदो" नमूना बनाने के लिए निर्देशों का पालन करें (http://www.breezejs.com/documentation/start-nuget)
  2. को BreezeSampleTodoItem.cs फ़ाइल

    [AttributeUsage(AttributeTargets.Property)] 
    public class CustomValidator : ValidationAttribute 
    { 
        public override Boolean IsValid(Object value) 
        { 
         string val = (string)value; 
         if (!string.IsNullOrEmpty(val) && val == "Error") 
         { 
          ErrorMessage = "{0} equal the word 'Error'"; 
          return false; 
         } 
         return true; 
        } 
    } 
    
  3. नए कस्टम के साथ डेकोरेट विवरण क्षेत्र में एक नए कस्टम सत्यापनकर्ता जोड़े सत्यापनकर्ता:

    [CustomValidator] 
    public string Description { get; set; } 
    
  4. उचित उपयोग जोड़ें बेशक ("सिस्टम" और "System.ComponentModel.DataAnnotations")।

  5. प्रोजेक्ट चलाएं।
  6. विवरण फ़ील्ड में से एक में "त्रुटि" टाइप करें और सहेजें।

यह वह जगह है जहां मैं हवा के माध्यम से एक त्रुटि देखने की उम्मीद करता हूं, या यहां तक ​​कि "डीबीइन्टिटी वैलिडेशन एक्सेप्शन" को एंटीटी फ्रेमवर्क से फेंक दिया जाएगा। मैंने एक ही परिणाम के साथ 2 अलग-अलग कंप्यूटरों पर कोशिश की है। इकाई डेटाबेस में सहेजी जाती है जैसे कि कोई त्रुटि नहीं थी। वास्तव में यदि आप कस्टम सत्यापनकर्ता की IsValid विधि के अंदर कहीं भी ब्रेक पॉइंट डालते हैं तो आप देखेंगे कि इसे भी नहीं कहा जा रहा है।

उत्तर

3

ब्रीज़ वी 0.78.1 के रूप में सभी पंजीकृत डीबीकॉन्टेक्स्ट सर्वर साइड सत्यापन अब EntityManager SaveChanges कॉल के दौरान निष्पादित होंगे। किसी भी अपवाद का सामना रोलबैक को सहेजने का कारण बनता है, और किसी भी सत्यापन त्रुटियों को वापस ब्राज़ील क्लाइंट में क्रमबद्ध करने के लिए किया जाएगा।

ध्यान दें कि यह कार्यक्षमता अभी तक पुराने ऑब्जेक्ट कॉन्टेक्स्ट (डीबी कॉन्टेक्स्ट के विपरीत) ईएफ मॉडल के लिए समर्थित नहीं है।

और ... इस मुद्दे की खोज करने और समाधान का सुझाव देने के लिए adamlj के लिए धन्यवाद।

1

मुझे यकीन है कि आप

प्राप्त सर्वर साइड DbContext सत्यापन त्रुटियों वापस ग्राहक के लिए से क्या मतलब

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

सर्वर

इकाई की रूपरेखा (जिससे आप अपने उदाहरण में उपयोग कर रहे हैं) स्वचालित रूप से डाटा एनोटेशन आप के लिए सत्यापन नियमों चलाता है ... कि मैन्युअल सुविधा जब तक आप अक्षम कर दिया है। यदि आप कस्टम उचित तरीके से सत्यापन नियम बनाते हैं, तो ईएफ इन्हें भी चलाएगा। This post by Daniel Wertheim बताता है कि इस तरह के नियम कैसे लिखना है। मैं उस पोस्ट के लिए हर विवरण में झुकाव नहीं कर सकता लेकिन यह मेरे लिए सही लगता है। यह एक कस्टम ईमेल-सत्यापन प्रारूप भी परिभाषित करता है!

यदि कस्टम डेटा एनोटेशन सत्यापन नियम को संलेखन करना आपके लिए बारोक भी लगता है (जैसा कि यह अक्सर मेरे लिए होता है), तो आप Server-side Interception "में चर्चा की गई BeforeSave... विधियों में से एक में अपना स्वयं का सत्यापन तर्क लिख और कॉल कर सकते हैं।

मुझे लगता है कि ये आपके सर्वोत्तम सर्वर विकल्प हैं। ग्राहक के लिए पर ...

ग्राहक

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

यदि आपके पास सुझाव या बेहतर विकल्प हैं, तो हम उन्हें सुनना पसंद करेंगे।

+0

हाय वार्ड, उत्तर के लिए धन्यवाद, और भयानक परियोजना! मैंने अपने प्रश्न को संपादित करने के लिए एक उदाहरण प्रदान किया है कि मैं जिस समस्या का सामना कर रहा हूं उसे दोहराना है। जिस समस्या में मैंने भाग लिया है वह यह है कि EFContextProvider.SaveChanges (saveBundle) विधि का उपयोग करते समय डेटा एनोटेशन का मूल्यांकन नहीं किया जा रहा है। मैंने ब्रीज़ के लिए सोर्स कोड खींचा और यदि मैं EFContextProvider के लिए कोड बदलता हूं। SaveChangesCore विधि का उपयोग ((डीबीकॉन्टेक्स्ट) (ऑब्जेक्ट) संदर्भ) ऑब्जेक्ट कॉन्टेक्स्ट .वेव चेंज() के बजाय .SaveChanges(), तो एनोटेशन का मूल्यांकन सही ढंग से किया जाता है। लेकिन मैं स्रोत को संशोधित नहीं करता। – adamlj

+0

एक और नोट, मैंने पहले सेव विधियों की जांच की। मेरी चिंता यह है कि मैं केवल एक बूल वापस कर सकता हूं। सत्यापन त्रुटियों के लिए उपयोगकर्ता को एक त्रुटि संदेश वापस पाने का कोई तरीका होना चाहिए। – adamlj

+0

आपको एक अपवाद फेंकना चाहिए जिसमें विफलता की व्याख्या शामिल है, उदाहरण के लिए, 'नया अमान्यऑपरेशन अपवाद ("अज्ञात प्रकार की इकाई को सहेज नहीं सकता") फेंकना;' झूठ लौटने से केवल उस इकाई को सहेजने के दौरान कॉन्टेक्स्टप्रोवाइडर को छोड़ दिया जाता है; यह सहेजना समाप्त नहीं करता है! "[सर्वर-साइड इंटरसेप्शन] देखें (http: //www.breezejs।कॉम/प्रलेखन/सर्वर-साइड-अवरोध) "दस्तावेज़ों में पृष्ठ – Ward

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