2011-06-24 13 views
12

मेरे पास अलग मॉडल और व्यूमोडेल कक्षाएं हैं। जहां व्यूमोडेल क्लासेस केवल यूआई स्तर सत्यापन करते हैं (देखें: Validation: Model or ViewModel)।मॉडल और दृश्य मॉडल के लिए प्रमाणीकरण सर्वोत्तम अभ्यास

मैं नियंत्रक में पोस्ट एक्शन पर सत्यापित कर सकता हूं कि मॉडल (vewmodel) मान्य है।

पूछें: मैं मॉडल (डेटा एनोटेशन के साथ मुख्य इकाई) को कैसे सत्यापित करूं?

मैं मॉडल ऑब्जेक्ट का उपयोग करके व्यूमोडेल विकसित नहीं कर रहा हूं। बस गुणों को डुप्लिकेट करना और उस विशेष दृश्य में आवश्यक सभी गुणों को जोड़ना।

//Model Class 
public class User 
{ 
    [Required] 
    public string Email {get; set;} 

    [Required] 
    public DateTime Created {get; set;} 
} 

//ViewModel Class 
public class UserViewModel 
{ 
    [Required] 
    public string Email {get; set;} 

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

//Post action 
public ActionResult(UserViewModel uvm) 
{ 
    if(ModelState.IsValid) 
     //means user entered data correctly and is validated 

    User u = new User() {Email = uvm.Email, Created = DateTime.Now}; 
    //How do I validate "u"? 

    return View(); 
} 

कुछ इस तरह करना चाहिए:

var results = new List<ValidationResult>(); 
var context = new ValidationContext(u, null, null); 
var r = Validator.TryValidateObject(u, context, results); 

क्या मैं सोच रहा हूँ (व्यापार इकाई के) आधार वर्ग में यह मान्यता तकनीक जोड़ रहा है, और यह जब मैं से मानचित्रण हूँ की पुष्टि व्यवसाय इकाई के लिए viewmodel वर्ग।

कोई सुझाव?

उत्तर

9

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

2) आप ऑटोमैपर का उपयोग करके ऑटोमैपर में देखना चाहेंगे, आपको x.name = y.name लिखना नहीं है।

3) आपके डेटाबेस मॉडल के लिए मैं डेटा-एनोटेशन के साथ रहूंगा।

नीचे सब कुछ नई जानकारी

पहले पर आधारित है और तुम सब की तरह आप वास्तविक मॉडल सत्यापन के लिए अब किया है मैं इसे कैसे करना होगा दोनों स्थान पर मान्यता से देना चाहिए। अस्वीकरण: इस बढ़िया तरीका

पहले और सभी अद्यतन UserViewModel

को
public class UserViewModel 
    { 
     [Required()] 
     [RegularExpression(@"^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9][email protected]((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$")] 
     public String Email { get; set; } 
    } 

तो कार्रवाई विधि

 // Post action 
     [HttpPost] 
     public ActionResult register (UserViewModel uvm) 
     { 
      // This validates the UserViewModel 
      if (ModelState.IsValid) 
      { 

       try 
       { 
        // You should delegate this task to a service but to keep it simple we do it here 
        User u = new User() { Email = uvm.Email, Created = DateTime.Now }; 
        RedirectToAction("Index"); // On success you go to other page right? 
       } 
       catch (Exception x) 
       { 
        ModelState.AddModelError("RegistrationError", x); // Replace x with your error message 
       } 

      }  

      // Return your UserViewModel to the view if something happened    
      return View(uvm); 
     } 

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

public class User 
    { 
     private string email; 
     private DateTime created; 

     public string Email 
     { 
      get 
      { 
       return email; 
      } 
      set 
      { 
       email = ValidateEmail(value); 
      } 
     } 

     private string ValidateEmail(string value) 
     { 
      if (!validEmail(value)) 
       throw new NotSupportedException("Not a valid email address");  

      return value; 
     } 

     private bool validEmail(string value) 
     { 
      return Regex.IsMatch(value, @"^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9][email protected]((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$"); 
     } 

अंतिम कुछ इकाई अपने खुद के कोड की जाँच करने के टेस्ट::

[TestClass()] 
    public class UserTest 
    { 

     /// <summary> 
     /// If the email is valid it is stored in the private container 
     /// </summary> 
     [TestMethod()] 
     public void UserEmailGetsValidated() 
     { 
      User x = new User(); 
      x.Email = "[email protected]"; 
      Assert.AreEqual("[email protected]", x.Email); 
     } 

     /// <summary> 
     /// If the email is invalid it is not stored and an error is thrown in this application 
     /// </summary> 
     [TestMethod()] 
     [ExpectedException(typeof(NotSupportedException))] 
     public void UserEmailPropertyThrowsErrorWhenInvalidEmail()  
     { 
      User x = new User(); 
      x.Email = "blah blah blah"; 
      Assert.AreNotEqual("blah blah blah", x.Email); 
     } 


     /// <summary> 
     /// Clears an assumption that on object creation the email is validated when its set 
     /// </summary> 
     [TestMethod()] 
     public void UserGetsValidatedOnConstructionOfObject() 
     { 
      User x = new User() { Email = "[email protected]" }; 
      x.Email = "[email protected]"; 
      Assert.AreEqual("[email protected]", x.Email); 
     } 
    } 
+0

पीआरडी @Serghei मैं वास्तव में जानना चाहता था मैं कैसे कर समाधान मैं के साथ आया था (शायद नहीं सबसे अच्छा) निम्नलिखित है मॉडल वर्ग को मान्य करें (जो देखने के लिए बाध्य नहीं है)। यह देखते हुए कि मेरे विचारों में उस विशेष दृश्य पर सभी आवश्यकताओं को पूरा करने के लिए विभिन्न मॉडल वर्गों (व्यू मॉडेल क्लास में) से गुण हैं। – Yahya

+0

@Yahya क्या आप एक उदाहरण पोस्ट कर सकते हैं? यह इंगित करना आसान होगा कि आपको कहां होना चाहिए, और कैसे, सत्यापन करना है। – David

+0

prd मैंने आपके लिए मूल प्रश्न में नमूना कोड जोड़ा है। मुझे आशा है कि अब यह समझ में आता है। – Yahya

2

मुझे लगता है कि इस

ASP.NET MVC Valdation

पर और सर्वर साइड सत्यापन के लिए डेटा एनोटेशन नज़र उपयोग करने के लिए आप fluent validation

का उपयोग करें और इस question

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