asp.net-mvc
डेटा एनोटेशन
खोज…
परिचय
हम अपने मॉडल कक्षाओं में डेटा एनोटेशन जोड़कर अपने आवेदन में सत्यापन जोड़ सकते हैं। डेटा एनोटेशन हमें उन नियमों का वर्णन करने की अनुमति देता है जो हम अपने मॉडल गुणों पर लागू करना चाहते हैं, और ASP.NET MVC उन्हें लागू करने और उपयोगकर्ताओं को उचित संदेश प्रदर्शित करने का ध्यान रखेगा।
ViewModel में उपयोग की जाने वाली मूल सत्यापन विशेषताएँ
नमूना
using System.ComponentModel.DataAnnotations;
public class ViewModel
{
[Required(ErrorMessage="Name is required")]
public string Name { get; set; }
[StringLength(14, MinimumLength = 14, ErrorMessage = "Invalid Phone Number")]
[Required(ErrorMessage="Phone Number is required")]
public string PhoneNo { get; set; }
[Range(typeof(decimal), "0", "150")]
public decimal? Age { get; set; }
[RegularExpression(@"^\d{5}(-\d{4})?$", ErrorMessage = "Invalid Zip Code.")]
public string ZipCode {get;set;}
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }
[Editable(false)]
public string Address{ get; set; }
}
राय
// Include Jquery and Unobstructive Js here for client side validation
@using (Html.BeginForm("Index","Home") {
@Html.TextBoxFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
@Html.TextBoxFor(model => model.PhoneNo)
@Html.ValidationMessageFor(model => model.PhoneNo)
@Html.TextBoxFor(model => model.Age)
@Html.ValidationMessageFor(model => model.Age)
@Html.TextBoxFor(model => model.ZipCode)
@Html.ValidationMessageFor(model => model.ZipCode)
@Html.TextBoxFor(model => model.Email)
@Html.ValidationMessageFor(model => model.Email)
@Html.TextBoxFor(model => model.Address)
@Html.ValidationMessageFor(model => model.Address)
<input type="submit" value="submit" />
}
नियंत्रक
public ActionResult Index(ViewModel _Model)
{
// Checking whether the Form posted is valid one.
if(ModelState.IsValid)
{
// your model is valid here.
// perform any actions you need to, like database actions,
// and/or redirecting to other controllers and actions.
}
else
{
// redirect to same action
return View(_Model);
}
}
दूरस्थ सत्यापन
रिमोट वैलिडेशन यह जांचने के लिए उपयोग किया जाता है कि इनपुट नियंत्रण में सामग्री दर्ज वैध है या नहीं, इसे जांचने के लिए सर्वर साइड में अजाक्स अनुरोध भेजकर।
काम कर रहे
RemoteAttribute
क्लाइंट से AJAX कॉल करके एक नियंत्रक क्रिया के लिए कार्य करता है, जिसमें क्षेत्र के मान को मान्य किया जाता है। नियंत्रक कार्रवाई फिर एक JsonResult
प्रतिक्रिया देता है जो सत्यापन सफलता या विफलता का संकेत देता है। आपकी कार्रवाई से true
लौटना इंगित करता है कि सत्यापन पास हो गया है। कोई भी अन्य मान विफलता का संकेत देता है। यदि आप false
वापस आते हैं, तो विशेषता में निर्दिष्ट त्रुटि संदेश का उपयोग किया जाता है। यदि आप कुछ और भी लौटाते हैं जैसे कि एक स्ट्रिंग या एक पूर्णांक, तो इसे त्रुटि संदेश के रूप में प्रदर्शित किया जाएगा। जब तक आपको अपने त्रुटि संदेश को गतिशील होने की आवश्यकता नहीं है, तब तक यह सही या गलत लौटने की समझ में आता है और सत्यापनकर्ता को विशेषता पर निर्दिष्ट त्रुटि संदेश का उपयोग करने दें।
ViewModel
public class ViewModel
{
[Remote("IsEmailAvailable", "Group", HttpMethod = "POST", ErrorMessage = "Email already exists. Please enter a different email address.")]
public string Email{ get; set; }
}
नियंत्रक
[HttpPost]
public JsonResult IsEmailAvailable(string Email)
{
// Logic to check whether email is already registered or Not.
var emailExists = IsEmailRegistered();
return Json(!emailExists);
}
आप RemoteAttribute
की AdditionalFields
RemoteAttribute
गुण का उपयोग करके नियंत्रक विधि में मॉडल के अतिरिक्त गुण पास कर सकते हैं। एक विशिष्ट परिदृश्य मॉडल के आईडी गुण को 'एडिट' फॉर्म में पास करना होगा, ताकि नियंत्रक तर्क मौजूदा रिकॉर्ड के लिए मूल्यों को अनदेखा कर सके।
नमूना
public int? ID { get; set; }
[Display(Name = "Email address")]
[DataType(DataType.EmailAddress)]
[Required(ErrorMessage = "Please enter you email address")]
[Remote("IsEmailAvailable", HttpMethod="Post", AdditionalFields="ID", ErrorMessage = "Email already exists. Please enter a different email address.")]
public string Email { get; set; }
नियंत्रक
[HttpPost]
public ActionResult Validate(string email, int? id)
{
if (id.HasValue)
{
return Json(!db.Users.Any(x => x.Email == email && x.ID != id);
}
else
{
return Json(!db.Users.Any(x => x.Email == email);
}
}
कार्यशील डेमो - अतिरिक्त फ़ील्ड
अतिरिक्त नोट
डिफ़ॉल्ट त्रुटि संदेश काफी अस्पष्ट है, इसलिए RemoteAttribute
का उपयोग करते समय हमेशा डिफ़ॉल्ट त्रुटि संदेश को ओवरराइड करना याद रखें।
RequiredAttribute
Required
विशेषता निर्दिष्ट करती है कि एक संपत्ति की आवश्यकता है। विशेषता पर ErrorMessage
गुण का उपयोग करने पर एक त्रुटि संदेश निर्दिष्ट किया जा सकता है।
पहले नामस्थान जोड़ें:
using System.ComponentModel.DataAnnotations;
और गुण को एक संपत्ति पर लागू करें।
public class Product
{
[Required(ErrorMessage = "The product name is required.")]
public string Name { get; set; }
[Required(ErrorMessage = "The product description is required.")]
public string Description { get; set; }
}
वैश्विक अनुप्रयोगों के लिए त्रुटि संदेश में संसाधनों का उपयोग करना भी संभव है। इस मामले में, ErrorMessageResourceName
संसाधन वर्ग (के संसाधन कुंजी के साथ निर्दिष्ट किया जाना चाहिए resx
फ़ाइल) उस पर setted किया जाना चाहिए ErrorMessageResourceType
:
public class Product
{
[Required(ErrorMessageResourceName = "ProductNameRequired",
ErrorMessageResourceType = typeof(ResourceClass))]
public string Name { get; set; }
[Required(ErrorMessageResourceName = "ProductDescriptionRequired",
ErrorMessageResourceType = typeof(ResourceClass))]
public string Description { get; set; }
}
StringLengthAttribute
StringLength
विशेषता किसी डेटा फ़ील्ड में अनुमत वर्णों की न्यूनतम और अधिकतम लंबाई निर्दिष्ट करती है। यह विशेषता गुणों, सार्वजनिक क्षेत्रों और मापदंडों पर लागू की जा सकती है। त्रुटि संदेश को विशेषता पर ErrorMessage
गुण पर निर्दिष्ट किया जाना चाहिए। गुण MinimumLength
और MaximumLength
क्रमशः न्यूनतम और अधिकतम निर्दिष्ट करता है।
पहले नामस्थान जोड़ें:
using System.ComponentModel.DataAnnotations;
और गुण को एक संपत्ति पर लागू करें।
public class User
{
// set the maximum
[StringLength(20, ErrorMessage = "The username cannot exceed 20 characters. ")]
public string Username { get; set; }
[StringLength(MinimumLength = 3, MaximumLength = 16, ErrorMessage = "The password must have between 3 and 16 characters.")]
public string Password { get; set; }
}
वैश्विक अनुप्रयोगों के लिए त्रुटि संदेश में संसाधनों का उपयोग करना भी संभव है। इस मामले में, ErrorMessageResourceName
संसाधन वर्ग (के संसाधन कुंजी के साथ निर्दिष्ट किया जाना चाहिए resx
फ़ाइल) उस पर setted किया जाना चाहिए ErrorMessageResourceType
:
public class User
{
[StringLength(20, ErrorMessageResourceName = "StringLength",
ErrorMessageResourceType = typeof(ResoucesKeys))]
public string Username { get; set; }
[StringLength(MinimumLength = 3,
MaximumLength = 16,
ErrorMessageResourceName = "StringLength",
ErrorMessageResourceType = typeof(ResoucesKeys))]
public string Password { get; set; }
}
रेंज एट्रीब्यूट
Range
विशेषता किसी भी गुण या सार्वजनिक क्षेत्र को सजा सकती है और एक सीमा निर्दिष्ट करती है कि एक संख्यात्मक क्षेत्र को मान्य माना जाना चाहिए।
[Range(minimumValue, maximumValue)]
public int Property { get; set; }
इसके अतिरिक्त, यह एक वैकल्पिक ErrorMessage
गुण को स्वीकार करता है जिसका उपयोग उपयोगकर्ता द्वारा अवैध डेटा दर्ज किए जाने पर प्राप्त संदेश को सेट करने के लिए किया जा सकता है:
[Range(minimumValue, maximumValue, ErrorMessage = "{your-error-message}")]
public int Property { get; set; }
उदाहरण
[Range(1,100, ErrorMessage = "Ranking must be between 1 and 100.")]
public int Ranking { get; set; }
RegularExpression विशेषता
[RegularExpression]
रेग्युलर एक्सप्रेशन [RegularExpression]
विशेषता किसी भी गुण या सार्वजनिक क्षेत्र को सजा सकती है और एक नियमित अभिव्यक्ति को निर्दिष्ट करती है जिसे संपत्ति के लिए वैध माना जाना चाहिए।
[RegularExpression(validationExpression)]
public string Property { get; set; }
इसके अतिरिक्त, यह एक वैकल्पिक ErrorMessage
गुण को स्वीकार करता है जिसका उपयोग उपयोगकर्ता द्वारा अवैध डेटा दर्ज किए जाने पर प्राप्त संदेश को सेट करने के लिए किया जा सकता है:
[RegularExpression(validationExpression, ErrorMessage = "{your-error-message}")]
public string Property { get; set; }
उदाहरण)
[RegularExpression(@"^[a-z]{8,16}?$", ErrorMessage = "A User Name must consist of 8-16 lowercase letters")]
public string UserName{ get; set; }
[RegularExpression(@"^\d{5}(-\d{4})?$", ErrorMessage = "Please enter a valid ZIP Code (e.g. 12345, 12345-1234)")]
public string ZipCode { get; set; }
गुण की तुलना करें
Compare
विशेषता एक मॉडल के दो गुण है।
त्रुटि संदेश को गुण ErrorMessage
का उपयोग करके या संसाधन फ़ाइलों का उपयोग करके निर्दिष्ट किया जा सकता है।
Compare
करने के लिए विशेषता using
के लिए निम्नलिखित नामस्थान using
करना शामिल है:
using System.ComponentModel.DataAnnotations;
तब आप अपने मॉडल में विशेषता का उपयोग कर सकते हैं:
public class RegisterModel
{
public string Email { get; set; }
[Compare("Email", ErrorMessage = "The Email and Confirm Email fields do not match.")]
public string ConfirmEmail { get; set; }
}
जब यह मॉडल मान्य होता है, यदि Email
और ConfirmEmail
Email
अलग-अलग मूल्य हैं, तो सत्यापन विफल हो जाएगा।
स्थानीयकृत त्रुटि संदेश
सभी सत्यापन विशेषताओं के साथ, संसाधन फ़ाइलों से त्रुटि संदेशों का उपयोग करना संभव है। इस नमूने में त्रुटि संदेश संसाधन फ़ाइल Resources
से लोड किया जाएगा, संसाधन का नाम CompareValidationMessage
:
public class RegisterModel
{
public string Email { get; set; }
["Email", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "CompareValidationMessage")]
public string ConfirmEmail { get; set; }
}
प्रॉपर्टी के नाम पर तार से बचें
संपत्ति मूल्य के लिए स्ट्रिंग का उपयोग करने से बचने के लिए, C # 6+ में आप nameof
कीवर्ड का उपयोग कर सकते हैं:
public class RegisterModel
{
public string Email { get; set; }
[Compare(nameof(Email), ErrorMessage = "The Email and Confirm Email fields do not match.")]
public string ConfirmEmail { get; set; }
}
त्रुटि संदेशों में प्लेसहोल्डर
आप अपने त्रुटि संदेशों में प्लेसहोल्डर का उपयोग कर सकते हैं। प्लेसहोल्डर {0}
को वर्तमान संपत्ति के प्रदर्शन नाम से बदल दिया जाता है और {1}
को संबंधित संपत्ति के प्रदर्शन नाम से बदल दिया जाता है:
public class RegisterModel
{
[Display(Name = "Email")]
public string Email { get; set; }
[Display(Name = "Confirm Email")]
[Compare("Email", ErrorMessage = "The '{1}' and '{0}' fields do not match.")]
public string ConfirmEmail { get; set; }
}
यदि मॉडल का सत्यापन विफल हो जाता है, तो त्रुटि संदेश होगा
'ईमेल' और 'ईमेल की पुष्टि करें' फ़ील्ड मेल नहीं खाते हैं।
कस्टम सत्यापन विशेषता
जब कुछ नियमों को मान्य करने की बात आती है, जो जेनेरिक डेटा सत्यापन नहीं हैं, जैसे कि यह सुनिश्चित करना कि किसी क्षेत्र की आवश्यकता है या मूल्यों की कुछ सीमा है, लेकिन वे आपके व्यावसायिक तर्क के लिए विशिष्ट हैं, तो आप अपना स्वयं का कस्टम सत्यापनकर्ता बना सकते हैं। एक कस्टम सत्यापन विशेषता बनाने के लिए, आपको बस ValidationAttribute
श्रेणी को inherit
करने की आवश्यकता है और इसकी IsValid
विधि को override
। IsValid
विधि दो मापदंडों को लेती है, पहला एक value
रूप में नामित object
और दूसरा एक ValidationContext object
जिसे IsValid
कहा जाता validationContext
। Value
तात्पर्य उस क्षेत्र से वास्तविक मान से है जिसे आपका कस्टम सत्यापनकर्ता मान्य करने जा रहा है।
मान लीजिए कि आप Custom Validator
माध्यम से Email
को मान्य करना चाहते हैं
public class MyCustomValidator : ValidationAttribute
{
private static string myEmail= "[email protected]";
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
string Email = value.ToString();
if(myEmail.Equals(Email))
return new ValidationResult("Email Already Exist");
return ValidationResult.Success;
}
}
public class SampleViewModel
{
[MyCustomValidator]
[Required]
public string Email { get; set; }
public string Name { get; set; }
}
यहाँ इसका डॉटनेटफिल्ड डेमो है
ईडीएमएक्स मॉडल - डेटा एनोटेशन
एडमेक्स मॉडल इंटर्नल
public partial class ItemRequest
{
public int RequestId { get; set; }
//...
}
इसमें डेटा एनोटेशन जोड़ना - यदि हम इस मॉडल को सीधे संशोधित करते हैं, जब मॉडल के लिए एक अपडेट किया जाता है, तो परिवर्तन खो जाते हैं। इसलिए
इस मामले में एक विशेषता जोड़ने के लिए 'आवश्यक'
एक नया वर्ग बनाएं - कोई भी नाम
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
//make sure the namespace is equal to the other partial class ItemRequest
namespace MvcApplication1.Models
{
[MetadataType(typeof(ItemRequestMetaData))]
public partial class ItemRequest
{
}
public class ItemRequestMetaData
{
[Required]
public int RequestId {get;set;}
//...
}
}
या
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace YourApplication.Models
{
public interface IEntityMetadata
{
[Required]
Int32 Id { get; set; }
}
[MetadataType(typeof(IEntityMetadata))]
public partial class Entity : IEntityMetadata
{
/* Id property has already existed in the mapped class */
}
}
डेटाबेस पहले कार्यान्वयन के लिए डेटा एनोटेशन (मॉडल कोड ऑटो-जेनरेट किया गया)
[MetadataType(typeof(RoleMetaData))]
public partial class ROLE
{
}
public class RoleMetaData
{
[Display(Name = "Role")]
public string ROLE_DESCRIPTION { get; set; }
[Display(Name = "Username")]
public string ROLE_USERNAME { get; set; }
}
यदि आपने डेटाबेस-प्रथम का उपयोग किया है और आपका मॉडल कोड स्वतः-जनरेट किया गया है, तो यह संदेश आपके मॉडल कोड के ऊपर दिखाई देगा:
यह कोड एक टेम्पलेट से उत्पन्न किया गया था। इस फ़ाइल में मैन्युअल परिवर्तन से आपके एप्लिकेशन में अप्रत्याशित व्यवहार हो सकता है। यदि कोड को पुन: उत्पन्न किया जाता है तो इस फ़ाइल में मैन्युअल परिवर्तन अधिलेखित कर दिए जाएंगे
यदि आप डेटा-एनोटेशन का उपयोग करना चाहते हैं और आप नहीं चाहते हैं कि यदि आप edmx को रीफ्रेश करते हैं तो उन्हें ओवर-राइट किया जाए, तो अपने मॉडल फ़ोल्डर में एक और आंशिक वर्ग जोड़ें जो ऊपर दिए गए उदाहरण की तरह दिखता है।