ASP.NET MVC डेटा प्रकार विशेषताओं का उपयोग करके ईमेल पता सत्यापन


163

मुझे ईमेल की मान्यता के साथ कुछ समस्याएं हैं।

मेरे मॉडल में:

[Required(ErrorMessage = "Field can't be empty")]
[DataType(DataType.EmailAddress, ErrorMessage = "E-mail is not valid")]
public string ReceiverMail { get; set; }

मेरे दृष्टीकोण से:

<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.TextBoxFor(m => m.ReceiverMail, new { @placeholder="E-mail"}) <br />
@Html.ValidationMessageFor(m => m.ReceiverMail)

जब आप फ़ील्ड को खाली छोड़ देते हैं, तो यह मुझे सही ढंग से दिखा रहा है कि "फ़ील्ड खाली नहीं हो सकती"। लेकिन जब आप एक अवैध ईमेल पते को भरते हैं जैसे: "fwenrjfw" तो फॉर्म यह नहीं कहता कि "ई-मेल मान्य नहीं है"।

मुझे ईमेल पते के रूप में इनपुट को मान्य करने के लिए फ़ॉर्म कैसे मिल सकता है? मैं इसके साथ कुछ मदद की तलाश कर रहा हूं।

जवाबों:


328

यदि आप .NET फ्रेमवर्क 4.5 का उपयोग कर रहे हैं, तो समाधान का उपयोग करना है EmailAddressAttribute जो अंदर रहता है System.ComponentModel.DataAnnotations

आपका कोड इस तरह दिखना चाहिए:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }

शुक्रिया @ शिट्टू ओलुगबांगा! लेकिन मुझे समझ नहीं आ रहा है कि यह काम क्यों नहीं करता है:[DataType(DataType.EmailAddress, ErrorMessage = "Error message.")]
वेलिंगटन ज़ानेली

15
@Wellington Zanelli - DataType (DataType.EmailAddress) का उपयोग उपयोगकर्ता इनपुट को मान्य करने के लिए नहीं किया जा सकता है। इसका उपयोग केवल प्रदर्शन / संपादक टेम्प्लेट का उपयोग करके मान प्रदान करने के लिए एक यूआई संकेत प्रदान करने के लिए किया जाता है।
लियाम

3
@ जनी DataType.EmailAddressमान्यता के बारे में नहीं है। यह डेटा प्रेजेंटेशन के बारे में है ...
सेबेस्टियन ज़ैवरी वाईनीओवेकी

3
मेरे पास एक ही मुद्दा है और मेरे लिए ईमेल सत्यापन 'नाम @ xxx' जैसे ईमेल को छोड़कर ठीक काम करता है। क्या किसी और ने इसे देखा है?
क्रेमेना लालोवा

3
@KremenaLalova name@xxxपूरी तरह से वैध ईमेल पता है, इसलिए उस पद्धति में कुछ भी गलत नहीं है। उदाहरण के username@localhostलिए उदाहरण पर विचार करें ।
जॉन बर्गमैन

39

Html.EditorForइसके बजाय सहायक विधि का प्रयास करें Html.TextBoxFor


1
यह सही उत्तर है क्योंकि यह आपके मॉडल में पहले से जोड़े गए डेटा प्रकार और त्रुटि का उपयोग करेगा।
रिकार्डो सांचेज

4
यह विधि डोमेन tld के लिए जाँच नहीं करती है, इसलिए कोई व्यक्ति myname @ में जो भी डाल सकता है और छोड़ सकता है .com और इसे सही ढंग से सत्यापित करेगा
जेसन

8
myname @ जो भी एक मान्य ईमेल पता है
michaelmsm89

पूरी तरह से पीवीसी 4 के लिए काम किया। धन्यवाद।
जोस गोमेज़

ईमेल को मान्य करने के लिए html.Editor के अंदर क्या लिखें?
नीरज कुमार

28

आपको रेग्युलर एक्सप्रेशन एट्रिब्यूट, कुछ इस तरह इस्तेमाल करने की जरूरत है:

[RegularExpression("^[a-zA-Z0-9_\\.-]+@([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$", ErrorMessage = "E-mail is not valid")]

और [आवश्यक] नहीं हटाएं क्योंकि [RegularExpression] खाली क्षेत्रों को प्रभावित नहीं करता है।


8
पुराना स्कुल अच्छा है, लेकिन जब से Microsoft ने एक विशेषता लागू की है तो यह बग और ओवरसाइट्स को संबोधित करता है जो कुछ स्थितियों, देशों, समय क्षेत्र या ग्रहों में हो सकते हैं। तो कस्टम रेगेक्स की तुलना में पूरी तरह से जारी कोड आधार का उपयोग करना सबसे अच्छा है। क्या आपका रेगेक्स नए शीर्ष स्तर के डोमेन को ध्यान में रखता है, उदाहरण के लिए?
पायोत्र कुल

2
ऐसा लगता है कि यह विदेशी पात्रों या इसमें कई गैर-मानक पात्रों के साथ किसी भी ईमेल पते के लिए विफल हो जाएगा।
एरिकपी

2
Regex के साथ ईमेल पतों को मान्य करना आमतौर पर एक भयानक विचार है ... लेकिन अगर आपको चाहिए, तो यहां एक उत्कृष्ट संदर्भ है .. नियमित-expressions.info/email.html
Molomby

9
यह रेगेक्स और वेबसाइट गलत है। नए TLD में 6 से अधिक वर्ण हैं। इस का पालन न करें।
jsgoupil

14

यदि आप अभी तक .net 4.5 का उपयोग नहीं कर रहे हैं:

/// <summary>
/// TODO: AFTER WE UPGRADE TO .NET 4.5 THIS WILL NO LONGER BE NECESSARY.
/// </summary>
public class EmailAnnotation : RegularExpressionAttribute
{
    static EmailAnnotation()
    {
        DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAnnotation), typeof(RegularExpressionAttributeAdapter));
    }

    /// <summary>
    /// from: http://stackoverflow.com/a/6893571/984463
    /// </summary>
    public EmailAnnotation()
        : base(@"^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*"
            + "@"
            + @"((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))$") { }

    public override string FormatErrorMessage(string name)
    {
        return "E-mail is not valid";
    }
}

तो आप यह कर सकते हैं:

    public class ContactEmailAddressDto
    {
        public int ContactId { get; set; }
        [Required]
        [Display(Name = "New Email Address")]
        [EmailAnnotation] //**<----- Nifty.**
        public string EmailAddressToAdd { get; set; }
    }

1
मुझे स्टैटिक कंस्ट्रक्टर पसंद है।
ब्रायन स्वीनी

1
@ ब्रायनस्वेनी, मैं इसका श्रेय नहीं ले सकता: पी। फिर भी एक और ख़बर मुझे यहाँ से सालों पहले मिली।
mcfea

10

मैं MVC का उपयोग करता हूं। 3. मेरी एक कक्षा में ईमेल एड्रेस प्रॉपर्टी का एक उदाहरण है:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[Email(ErrorMessage = "The email address is not valid")]
public string Email { get; set; }

Requiredइनपुट वैकल्पिक है , तो निकालें । नियमित अभिव्यक्तियों की कोई आवश्यकता नहीं है, हालांकि मेरे पास एक ऐसा विकल्प है जो ईमेल पते के सभी विकल्पों को आरएफसी 2822 के स्तर तक ले जाता है (यह बहुत लंबा है)।


3
आपकी ईमेल विशेषता किस नामस्थान में है? या यह एक कस्टम विशेषता है?
उपयोगकर्ता

5
MVC 4 का उपयोग करता है [EmailAddress]और आपको using System.ComponentModel.DataAnnotations;
Piotr Kula

1
ऐसा लगता है कि कोई फर्क नहीं पड़ता कि मैं क्या करता हूं, Emailया तो उपयोग या RegularExpressionक्षेत्र को आवश्यक बनाता है। Requiredएनोटेशन को हटाने से कोई प्रभाव नहीं पड़ता है। RegularExpressionसत्यापन के साथ फ़ील्ड बनाने के लिए क्या करना है पर कोई सुझाव खाली फ़ील्ड स्वीकार करते हैं?
एरिक के

@QuantumDynamix एक विकल्प के रूप में अपनी नियमित अभिव्यक्ति के लिए एक खाली स्ट्रिंग परीक्षण जोड़ने का प्रयास करें। कभी कोशिश नहीं की, लेकिन कौन जानता है?
पीटर स्मिथ


4

MVC5 परियोजना में उपरोक्त कोड का उपयोग किया है और यह सत्यापन त्रुटि के साथ पूरी तरह से ठीक काम करता है। बस इस कोड का प्रयास करें

   [Required]
   [Display(Name = "Email")]
   [EmailAddress]

   [RegularExpression(@"^([A-Za-z0-9][^'!&\\#*$%^?<>()+=:;`~\[\]{}|/,₹€@ ][a-zA-z0- 
    9-._][^!&\\#*$%^?<>()+=:;`~\[\]{}|/,₹€@ ]*\@[a-zA-Z0-9][^!&@\\#*$%^?<> 
        ()+=':;~`.\[\]{}|/,₹€ ]*\.[a-zA-Z]{2,6})$", ErrorMessage = "Please enter a 
   valid Email")]


   public string ReceiverMail { get; set; }

1
StackOverflow में आपका स्वागत है। कोड-ओनली उत्तरों को अच्छा अभ्यास नहीं माना जाता है। कृपया बताएं कि यह क्या करता है और यह समस्या का समाधान कैसे करता है।
क्विनज

0

लिपियों को आमतौर पर html पेज के अंत में लोड किया जाता है, और MVC बंडलों के उपयोग की सिफारिश करता है, बस कह रहा है। तो मेरी सबसे अच्छी शर्त यह है कि आपकीjquery.validate फाइलें किसी तरह से बदल गईं या नवीनतम संस्करण में अपडेट नहीं की गईं, क्योंकि वे ई-मेल इनपुट को मान्य करती हैं।

तो आप या तो अपने नगेट पैकेज को अपडेट / रिफ्रेश कर सकते हैं या अपना खुद का फंक्शन लिख सकते हैं।

यहाँ एक उदाहरण है जिसे आप एक अतिरिक्त फ़ाइल में जोड़ेंगे jquery.validate.unobtrusive:

$.validator.addMethod(
    "email",
    function (value, element) {
        return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
    },
    "This e-mail is not valid"
);

यह वर्तमान jquery.validateरेगेक्स की एक प्रति और पेस्ट है , लेकिन इस तरह से आप अपने कस्टम त्रुटि संदेश सेट कर सकते हैं / अतिरिक्त तरीकों को उन क्षेत्रों में जोड़ सकते हैं जिन्हें आप निकट भविष्य में मान्य करना चाहते हैं।


0

ऊपर के अनुसार यह एक ईमेल पते के सर्वर साइड सत्यापन को ठीक करेगा:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }

तथापि...

यदि आप JQuery क्लाइंट साइड सत्यापन का उपयोग कर रहे हैं, तो आपको पता होना चाहिए कि ईमेल क्लाइंट साइड (JQuery सत्यापन) के लिए अलग सर्वर साइड (मॉडल सत्यापन) को मान्य करता है। उस परीक्षा में @ उदाहरण (एक शीर्ष स्तर का डोमेन ईमेल पता) सर्वर साइड में विफल हो जाएगा, लेकिन क्लाइंट की तरफ ठीक होगा।

इस विषमता को ठीक करने के लिए आप डिफ़ॉल्ट क्लाइंट साइड ईमेल सत्यापन को इस प्रकार से ओवरराइड कर सकते हैं:

$.validator.methods.email = function (value, element) {
    return this.optional(element) || /^[a-z0-9._]+@[a-z]+\.[a-z.]+/.test(value);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.