2009-10-19 19 views
5

विभिन्न कार्यों के लिए मेरे मॉडल को मान्य करने के लिए सबसे अच्छा अभ्यास क्या है, उदाहरण के लिए, बनाने और हटाने के लिए अलग-अलग सत्यापन नियम?एएसपीनेट एमवीसी विभिन्न कार्यों के लिए अलग-अलग सत्यापन नियम

धन्यवाद!

स्पष्टीकरण: मुझे लगता है कि इसे कुछ स्पष्टीकरण की आवश्यकता है क्योंकि उत्तर प्रश्न को संबोधित नहीं कर रहे हैं।

उदाहरण के लिए,

व्यक्ति पुष्टि नाम, उम्र है और ईमेल नहीं उपयोग में हटाएं व्यक्ति मान्य करता है कि व्यक्ति एक जनक नहीं है कि बनाएँ। बिजनेस लॉजिक निर्देश देता है कि माता-पिता को

मेरे पास इन दो अलग-अलग सत्यापन परिदृश्य कैसे हैं?

उत्तर

2

जैसा कि मैं समझता हूं कि आप अपने सत्यापन नियमों पर अधिक नियंत्रण चाहते हैं। आप यहां वर्णित सत्यापन नियम मैन्युअल रूप से जोड़ सकते हैं: MVC 2.0 Client validation exposed यह आपको सत्यापन को व्यवस्थित करने के तरीके पर पूर्ण नियंत्रण देता है, कौन सा नियम, जिसमें कौन सा एक्शन इत्यादि शामिल है,

0

यह शायद Validator Toolkit for ASP.NET MVC

यह टूलकिट क्लाइंट पक्ष और सर्वर साइड सत्यापन कोड उत्पन्न करता है उपयोग करने के लिए सबसे अच्छा है।

यहां एक हालिया ब्लॉग पोस्ट है जो compares different validation techniques and frameworks है।

यदि आप jQuery का उपयोग कर रहे हैं तो jQuery validation plugin उपयोग करने योग्य है। बेशक आपको अभी भी अपना स्वयं का सर्वर-साइड सत्यापन लिखना है (या इसके लिए एक और ढांचा का उपयोग करना)।

1

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

public class FluentValidationModelBinder : DefaultModelBinder { 
     private readonly IValidatorFactory _validatorFactory; 

     public FluentValidationModelBinder(IValidatorFactory validatorFactory) { 
      _validatorFactory = validatorFactory; 
     } 

     protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) { 
      var model = bindingContext.Model; 
      base.OnModelUpdated(controllerContext, bindingContext); 
      IValidator validator = _validatorFactory.GetValidator(bindingContext.ModelType); 
      if (validator != null) { 
       var result = validator.Validate(model); 
       if (!result.IsValid) { 
        result.AddToModelState(bindingContext.ModelState, ""); 
       } 
      } 
     } 
    } 
0

साथ काम करता है आप का उपयोग करते हैं ASP.NET MVC 1, आप DataAnnotationsModelBinder विस्तार की जाँच करेगा देख सकते हैं। System.ComponentModel.DataAnnotations बहुत उपयोगी सत्यापन विशेषता ढांचे है! और एएसपी.नेट एमवीसी 2 डिफॉल्ट मोडोडिंडर ने इसका समर्थन किया।

http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471

0

आप ASP.NET MVC (xVal, डेटा एनोटेशन जिम्मेदार बताते हैं, आदि) के लिए कई मान्यता ढाँचे में से एक का उपयोग करने के लिए और केवल एक विशेष कार्य के लिए एक मॉडल के क्षेत्रों के एक सबसेट को मान्य, सबसे आसान चाहते हैं समाधान [Bind] विशेषता का उपयोग करना है।

जबकि मैं निश्चित रूप से ऐसे मामले के बारे में सोच सकता हूं जहां आप केवल मॉडल के फ़ील्ड (यानी Create एक्शन में) के सबसेट के खिलाफ मान्य होना चाहते हैं, मैं ऐसे मामले के बारे में नहीं सोच सकता जहां आप किसी विशेष फ़ील्ड के सत्यापन चाहते हैं दो अलग-अलग कार्यों के बीच पूरी तरह अलग होना।

डेटा एनोटेशन सत्यापनकर्ता विशेषताओं के संयोजन के साथ एक व्यक्ति मॉडल ऑब्जेक्ट का उपयोग करके यहां एक साधारण उदाहरण है। Create और Update कार्रवाई मॉडल के फ़ील्ड के एक अलग सेट के विरुद्ध मान्य होगी।


मॉडल:

public class Person 
{ 
    [Required] 
    Int32 Id { get; set; } 

    [Required] 
    String FirstName {get; set;} 

    [Required] 
    String LastName {get; set;} 
} 


नियंत्रक क्रिया:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create([Bind(Exclude = "Id")] Person person) 
{ 
    // this action will not perform any validation checks against the Id property of the model 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Update(Person person) 
{ 
    // this action will perform validation checks against all model properties, including Id 
} 

उपरोक्त उदाहरण में, Create कार्रवाई पूरी तरह से 01 पर ध्यान नहीं देगाPerson मॉडल ऑब्जेक्ट की विशेषता। यह इस संपत्ति को बांधने का प्रयास नहीं करेगा, न ही यह इसके खिलाफ कोई सत्यापन करने का प्रयास करेगा। चूंकि किसी व्यक्ति के पास सृजन के समय कोई आईडी नहीं होगी, वही वही है जो आप चाहते हैं। दूसरी ओर, Update कार्रवाई, मॉडल के सभी गुणों के खिलाफ बाध्य और मान्य होगी।

तथ्य यह है कि Bind विशेषता विधि तर्क पर निर्दिष्ट है जो कोड को बदसूरत तरफ थोड़ा सा बना सकता है। हालांकि, अगर Exclude सूची लंबी हो जाती है, तो आप कुरूपता को कम करने में मदद के लिए हमेशा कुछ अतिरिक्त लाइन ब्रेक और व्हाइटस्पेस जोड़ सकते हैं।

1

स्पष्टीकरण: मुझे लगता है कि इसे कुछ स्पष्टीकरण की आवश्यकता है क्योंकि उत्तर प्रश्न को संबोधित नहीं कर रहे हैं।

उदाहरण के लिए,

व्यक्ति पुष्टि नाम, उम्र है और ईमेल उपयोग में नहीं हटाएं व्यक्ति मान्य करता है कि व्यक्ति एक जनक नहीं है कि बनाएँ। बिजनेस लॉजिक निर्देश देता है कि माता-पिता को

मेरे पास इन दो अलग-अलग सत्यापन परिदृश्य कैसे हैं?

"क्या भिन्न होता है।"

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

public class Blub 
{ 
    public int BlubId { get; set; } 
    public string Name { get; set; } 
    public bool SomeBlockingCondition { get; set; } 
} 

public class BlubEditController : Controller 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Rename(int blubId) 
    { 
     var ctx = new DataContext(); 
     var blub = ctx.Blubs.Single(o => o.BlubId==blubId); 
     return ShowRenameForm(blub); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Rename(int blubId, RenameCommand cmd) 
    { 
     var ctx = new DataContext(); 
     var blub = ctx.Blubs.Single(o => o.BlubId==blubId); 

     cmd.Subject = blub; 

     if (cmd.Validate(ModelState, "cmd.")) 
     { 
      cmd.Execute(); 
      ctx.SubmitChanges(); 
      return RedirectToAction("Show", new { blubId = blubId }); 
     } 
     else 
     { 
      return ShowRenameForm(blub); 
     } 
    } 
} 

public class RenameCommand 
{ 
    public Blub Subject { get; set; } 

    public string Name { get; set; } 

    public bool Validate(ModelStateDictionary modelState, string prefix) 
    { 
     if (Subject.SomeBlockingCondition) 
     { 
      modelState.AddModelError(prefix + "SomeBlockingCondition", "No!"); 
      return false; // Optional shortcut return to prevent further validation. 
     } 

     if (String.IsNullOrEmpty(this.Name)) 
     { 
      modelState.AddModelError(prefix + "Name", "Seriously, no."); 
     } 

     return modelState.IsValid; 
    } 

    public void Execute() 
    { 
     Subject.Name = this.Name; 
    } 
} 
+0

ग्रेट उत्तर। धन्यवाद – user10479

0

मुझे लगता है कि, इस मामले के लिए, बस डोमेन में कुछ कोड लिखें डिलीट के मॉडल (बीएलएल) का फैसला करने के लिए कि क्या कुछ व्यक्ति को हटाया जा सकता है, या एसक्यूएल या एसपी में कुछ कोड लिख सकते हैं और हटाए जाने पर समर्पित करने के लिए मूल्य वापस कर सकते हैं।

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