2012-01-31 13 views
5

जाँच शामिल नहीं मैंASP.MVC3 ModelState.IsValid RemoteAttribute

public class EditModel 
{ 
    [Remote("IsNameAvailable", "Home", ErrorMessage = "Name is in use.")] 
    [Display(Name = "Name")] 
    public string Name{ get; set; } 
} 

के रूप में और घर नियंत्रक

public JsonResult IsNameAvailable(string name) 
{ 
    if (duplicate) 
     return Json(false, JsonRequestBehavior.AllowGet); 
    else 
     return Json(true, JsonRequestBehavior.AllowGet); 
} 

में एक चर को परिभाषित लेकिन जब मैं सहेजें कार्रवाई में ModelState.IsValid जाँच, यह हमेशा सत्य लौटाता है, यहां तक ​​कि मैं दृश्य पर त्रुटि संदेश प्रदर्शन देख सकता हूं।

public ActionResult Save(EditModel editModel) 
{ 
    if (!ModelState.IsValid) 
    { 
     //Return to view and display error in view 
     return View("Home", editModel); 
    } 

    //Input data is valid and save record 
    Repository.Save(editModel.Name); 
} 

[समस्या]
कैसे कर सकते हैं भी ModelState जांच एक मॉडल में RemoteAttribure द्वारा मान्यता नियम?

उत्तर

2

आपके पास दो विकल्प हैं। आप या तो IDataErrorInfo या IValidatableObject इंटरफ़ेस को कार्यान्वित कर सकते हैं और वहां सत्यापन को दोबारा कर सकते हैं। इन इंटरफेस को एमवीसी द्वारा आउट ऑफ़ द बॉक्स का समर्थन किया जाता है और आपका मॉडलस्टेट इसे प्रतिबिंबित करेगा।

आपका दूसरा विकल्प आपकी खुद की विशेषता बना रहा है जो RemoteAttribute से प्राप्त होता है। इस कस्टम विशेषता में, एक ही सत्यापन सर्वर-पक्ष को लागू करने के लिए तर्क जोड़ें।

अंतिम विकल्प वह है जिसे मैं जाना चाहता हूं, लेकिन इसमें थोड़ा और समय लगता है। This question हालांकि इसके साथ आपकी मदद करनी चाहिए।

+0

आपके सुझाव के लिए धन्यवाद! मामला यह है कि मेरे पास ऐसे कई मॉडल हैं और मैं कोड को कम करने के लिए सबसे अच्छा विकल्प ढूंढना चाहता हूं। पहले और दूसरे विकल्पों को कोड की आवश्यकता है जो कि दूरस्थ विशेषता का उपयोग करने वाले मॉडल की संख्या पर निर्भर करता है। क्या आप अंतिम विकल्प के बारे में अधिक बता सकते हैं? – daniel

+2

रिमोटएट्रिब्यूट की IsValid विधि वास्तव में सर्वरसाइड कहा जाता है। यदि आप .NET decompiler के साथ इस विधि को देखते हैं, तो आप देखेंगे कि यह सभी विधि "सत्य लौटती है"। RemoteAttribute से प्राप्त अपनी खुद की विशेषता बनाएं और उस ISValid() विधि में कुछ वास्तविक सत्यापन तर्क रखें। उदाहरण के लिए, ValidationMethod कहें, आप अपनी खुद की विशेषता पर एक अतिरिक्त संपत्ति बना सकते हैं। विशेषता का उपयोग करते समय, आप उस विधि के साथ पास कर सकते हैं जिसे सत्यापन करना चाहिए। और आपकी IsValid() विधि में, आप उस सत्यापन विधि को कॉल कर सकते हैं। –

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