2010-11-28 25 views
10

रेल के पास एक बहुत सुविधाजनक विशिष्टता सत्यापन है।विशिष्टता के एएसपी.नेट एमवीसी सत्यापन

एएसपी.नेट एमवीसी नहीं करता है।

मुझे यह सुनिश्चित करने की ज़रूरत है कि उपयोगकर्ता द्वारा दर्ज किया गया ई-मेल पता अभी तक किसी द्वारा पंजीकृत नहीं किया गया है।

मैं इस तरह के सत्यापन करने का केवल एक ही तरीका देख सकता हूं: UniqueAttribute क्लास में एक नया डेटा संदर्भ ऑब्जेक्ट बनाएं।

लेकिन मुझे डर है कि एक नए डेटा संदर्भ ऑब्जेक्ट पर स्मृति बर्बाद कर रहा है केवल एक सत्यापन के लिए खतरनाक है।

क्या मैं गलत हूँ? क्या ऐसा करने का कोई बेहतर तरीका है?

अद्यतन

यह मैं अब तक

public class UniqueEmailAttribute : ValidationAttribute { 
    public override bool IsValid(object value) { 
     DataContext db = new DataContext(); 
     var userWithTheSameEmail = db.Users.SingleOrDefault(
      u => u.Email == (string)value); 
     return userWithTheSameEmail == null; 
    } 
} 

// Usage 
[UniqueEmail(ErrorMessage="This e-mail is already registered")] 
public string Email { get; set; } 

वहाँ दो समस्याएं हैं क्या मिल गया है।

  1. यह सिर्फ एक UniqueAttribute वर्ग, ई मेल के लिए नहीं अलग वर्ग, उपयोगकर्ता नाम आदि मैं ऐसा कैसे कर सकते हैं के लिए अच्छा हो सकता है?

  2. नया डेटा संदर्भ हर बार आपको एक विशेषता को सत्यापित करने की आवश्यकता होती है।

समाधान

तो अंत में मैं मेज पर एक अद्वितीय बाधा बना लिया है और अब मैं सिर्फ उपयोगकर्ता भंडार में SqlException अवरोधन करने की है। पूरी तरह से काम करता है और पूरी तालिका में एक ही नोड की खोज करने से शायद अधिक कुशल है। धन्यवाद!

+2

रेल बनाम एएसपी.नेट एमवीसी संतरे से सेब की तुलना करना है, वे समान नहीं हैं। एएसपी.नेट एमवीसी में औपचारिक डेटा दृढ़ता परत नहीं है, आपको कई लोगों में से एक चुनना है, और – TFD

+0

@TFD के साथ संघर्ष करना है, यह एक अच्छा बिंदु है। मैं मानता हूं, कोई डेटा परत नहीं है, इसलिए डेटाकॉन्टेक्स्ट को कहीं भी संग्रहीत किया जाना चाहिए, यही मेरा सवाल है। – Alex

+0

1] डिफ़ॉल्ट रूप से, संपत्ति का नाम जिस पर विशेषता लागू होती है उसे क्वेरी विधि को क्वेरी-स्ट्रिंग पैरामीटर के रूप में भेजा जाता है। – swapneel

उत्तर

1

ऐसा करने का एक मूर्ख तरीका एक सत्यापन विशेषता बनाना है जो ईमेल पते के लिए डेटाबेस से पूछताछ करेगा। यह निश्चित रूप से विलंबता जोड़ देगा।

तालिका पर एक अनूठी बाधा उत्पन्न करने और SqlException को अवरुद्ध करने का एक विकल्प होगा।

+12

वास्तव में आपकी "मूर्खतापूर्ण" विधि नहीं है। यह दौड़ की स्थिति बनाता है।दो अलग-अलग सर्वर प्रक्रियाएं एक ही समय में एक ही ईमेल पते के लिए पूछ सकती हैं और दोनों को बताया जाना चाहिए कि यह डीबी में नहीं है। फिर वे दोनों इसे बचाने का प्रयास करेंगे। केवल एक जीत जाएगा। इस प्रकार की विशिष्टता सुनिश्चित करने का एकमात्र मूर्ख तरीका डेटाबेस में एक अद्वितीय बाधा है। – mlibby

+0

मैंने अपनी पोस्ट को कक्षा के साथ अपडेट किया है जो काम करता है, लेकिन यह अभी भी नहीं है जो मैं चाहता हूं। क्या एक अद्वितीय बाधा बेहतर प्रदर्शन के रूप में होने जा रही है? – Alex

+0

mcl, यदि आप प्रत्येक HTTP अनुरोध के लिए समान इकाई-कार्य/कनेक्शन का उपयोग कर रहे हैं, तो यह एक समस्या नहीं होनी चाहिए, जो आमतौर पर अनुशंसित अभ्यास है। लेकिन यह निश्चित रूप से कुछ पता होना चाहिए। –

7

एमवीसी 3 रिलायंस उम्मीदवार के पास नए प्रमाणीकरण गुणों को रिमोट अमान्यता के रूप में रखा गया है - जहां आप क्लाइंटसाइड (jquery) पर सत्यापन के लिए एक विधि पंजीकृत कर सकते हैं।

नीचे उदाहरण RemoteAttribute

नई RemoteAttribute सत्यापन विशेषता jQuery मान्यकरण प्लग-इन के रिमोट सत्यापनकर्ता, जो कि वास्तविक सत्यापन तर्क करता है सर्वर पर एक विधि कॉल करने के लिए क्लाइंट-साइड सत्यापन सक्षम बनाता है का लाभ लेता है देखना ।

निम्नलिखित उदाहरण में, उपयोगकर्ता नाम संपत्ति में रिमोटएट्रिब्यूट लागू है। इस प्रॉपर्टी को एडिट व्यू में संपादित करते समय, क्लाइंट सत्यापन इस क्षेत्र को सत्यापित करने के लिए UserController क्लास पर UserNameAvailable नाम की एक क्रिया को कॉल करेगा।

public class User { 
    [Remote("UserNameAvailable", "Users")] 
    public string UserName { get; set; } 
} 

निम्नलिखित उदाहरण संबंधित नियंत्रक को दिखाता है।

public class UsersController { 
     public bool UserNameAvailable(string username) { 
      return !MyRepository.UserNameExists(username); 

     } 
    } 

Mvc 3

अद्यतन

public bool UserNameAvailable(string Propertyname) 
    { 
     if (Request.QueryString[0]= "UserName") 
     { 
      //validate username 
     } 
     elseif (Request.QueryString[0]= "Email") 
     { 
      //Validate Email 
     } 

    } 
+0

ध्यान दें कि यह केवल क्लाइंट साइड सत्यापन के लिए काम करता है। सर्वर साइड सत्यापन जोड़ने के लिए आपको RemoteAttribute का विस्तार करने की आवश्यकता है। देखें: http://www.codeproject.com/Articles/682434/Custom-Remote-Attribute-for-Client-Server-Validati – Kurren

2

ASP.Net एक विशेषता यह है कि अपने आप उपयोगकर्ता के ईमेल पते जब कोई उपयोगकर्ता रजिस्टरों की विशिष्टता की जांच कर सकते है। यह एएसपी.Net सदस्यता सेवा है और आप इसका उपयोग करने के लिए इसका उपयोग कर सकते हैं भले ही आप इसकी सभी सुविधाओं का उपयोग न करें।

आप अपने MVC आवेदन में पूर्ण सदस्यता सुविधा का उपयोग नहीं किया जाता है तो तुम सब करने की जरूरत है का उपयोग कर रहा है

Membership.FindUsersByEmail (emailYouAreLookingFor);

यदि कोई मान वापस आ गया है, तो आप जानते हैं कि पता अद्वितीय नहीं है। यदि आप उपयोगकर्ताओं को बनाने के लिए सदस्यता सेवा का उपयोग कर रहे हैं, तो सदस्यता सेवा स्वचालित रूप से जांच करेगी और यदि उपयोगकर्ता का ईमेल पता अद्वितीय नहीं है तो आपको एक कोड वापस कर देगा।

सदस्यता सेवा System.Web.Security क्षेत्र में बैठता है ताकि आप एक

जरूरत System.Web.Security का उपयोग कर सकता है;

आपके नियंत्रक में संदर्भ।

यहाँ एक उदाहरण

  MembershipCreateStatus createStatus = MembershipService.CreateUser(UserName, Password, Email); 

      if (createStatus == MembershipCreateStatus.DuplicateEmail) 
      { 

        //do something here 
      } 
      else 
      { 
        //do something here 

      } 

मुझे आशा है कि इस मदद करता है!

1

एमवीसी में एक सामान्य रिमोट अद्वितीय वैधता बनाने का सही तरीका this MVC forum. में काउंसेलोरबेन द्वारा पाया जा सकता है। यह मेरे एमवीसी अद्वितीय रिमोट वैधता आलेख पर आधारित है http://msdn.microsoft.com/en-us/library/gg508808(VS.98).aspx

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