2010-02-08 16 views
5

मैं, asp.NET MVC 2 RC2 में अपने मॉडल को मान्यता जोड़ने के लिए DataAnnotations उपयोग करने के लिए कोशिश कर रहा हूँ TryUpdateModelasp.NET MVC 2 DataAnnotations UpdateModel <T> सत्यापन

 var user = UserManager.Find(id); 

     this.TryUpdateModel<IProvisioningObject>(user, form.ToValueProvider()); 

यह मॉडल अद्यतन करता है का उपयोग करते हुए, लेकिन सत्यापन कभी नहीं कहा जाता है। मैंने TryUpdateModel के साथ-साथ (जो कि प्रत्यक्ष प्रकार का उपयोगकर्ता है) का उपयोग करने का प्रयास नहीं किया, प्रॉपिजनिंग ऑब्जेक्ट का उपयोग करके फॉर्म वैल्यू प्रदाता का उपयोग नहीं कर रहा है (जिसका सत्यापन मेटाडेटा है), इसका कोई फायदा नहीं हुआ।

उदाहरण के लिए Googling केवल मुझे एक पैरामीटर

public ActionResult Update(User user) 

कौन सा मैं अद्यतन परिदृश्यों के लिए नापसंद के माध्यम से जुड़ कर DataAnnotations का उपयोग करने के तरीके देता है।

कोई सुझाव और/या समाधान?

EDIT मेरी ऑब्जेक्ट्स डब्ल्यूसीएफ सेवा से स्वत: जेनरेट की गई वस्तुएं हैं।

मैंने आंशिक रूप से DataAnnotations जोड़ने में सक्षम होने के लिए आंशिक बनाया। मैं TryUpdateModel को तीन बार कॉल करता हूं क्योंकि यह स्पष्ट रूप से विरासत का समर्थन नहीं करता है, जो मुझे लगता है कि DataAnnotations के साथ भी मेरी समस्या है। मैं प्रोविजनिंग ऑब्जेक्ट के लिए सत्यापन गुण निर्दिष्ट करता हूं, और बाध्यकारी विरासत में ऐसी चीजों की तलाश नहीं करता है।

[MetadataType(typeof(ProvisioningObjectMetadata))] 
public partial class ProvisioningObject : IProvisioningObject 
{ 
    public string DisplayNameInvariant { get { return string.IsNullOrEmpty(this.DisplayName) ? this.Name : this.DisplayName; } } 
} 


[MetadataType(typeof(UserMetadata))] 
public partial class User : IUser 
{ 
} 


public class ProvisioningObjectMetadata 
{ 
    [DisplayName("Country")] 
    public string CountryIsoCode { get; set; } 

    [Required(ErrorMessageResourceType = typeof(Properties.Validation), ErrorMessageResourceName = "DisplayNameIsRequired")] 
    [TempValidator] 
    public string DisplayName { get; set; } 
} 


public class UserMetadata 
{ 
    [DisplayName("Username")] 
    public string Name { get; set; } 
} 


// Controller action 
    public ActionResult Update(string id, FormCollection form) 
    { 
     var user = UserManager.Find(id); 

     this.TryUpdateModel<IUser>(user.User, form.ToValueProvider()); 
     this.TryUpdateModel<IPerson>(user.User, form.ToValueProvider()); 
     this.TryUpdateModel<IProvisioningObject>(user.User, form.ToValueProvider()); 

     if (ModelState.IsValid) // always true 
     { 
      return Redirect; 
     } 
     else 
     { 
      return View(); 
     } 
    } 

मैं UserMetadata में DisplayName मेटाडेटा जोड़ने, तो यह अपेक्षा के अनुरूप काम करता है, लेकिन कुछ भी नहीं है कि के लिए बहुत बेमानी लगता है। और इसका मतलब यह होगा कि मुझे अपने सभी विरासत वाले इंटरफेस को कॉपी/पेस्ट करना होगा, इसलिए TryUpdateModel उचित व्यवहार करता है।

मुझे लगता है कि मैं ऐसे तरीके की तलाश कर रहा हूं जिसके लिए मुझे विरासत कक्षाओं में मेरी सत्यापन विशेषताओं को कॉपी और पेस्ट करने की आवश्यकता नहीं है।

उत्तर

1

नई उत्तर:

"मेरी वस्तुओं एक WCF सेवा से स्वत: जनरेट वस्तुओं रहे हैं।"

स्वत: जेनरेटेड ऑब्जेक्ट्स पर उनके कोई गुण नहीं होंगे। क्या आप सर्वर की तरफ या क्लाइंट साइड पर अपनी ऑब्जेक्ट्स और उनके गुणों को परिभाषित कर रहे हैं?

पुराना उत्तर: यदि आपका मेटाडाटा IProvisioningObject पर नहीं है तो कोई सत्यापन नहीं कहा जाएगा। एमवीसी 2 डिफॉल्ट मॉडल बाइंडर केवल जानता है कि "अतिरिक्त" [मेटाडाटा टाइप (दोस्त क्लास)] सत्यापन जानकारी कैसे प्राप्त करें।

अद्यतन परिदृश्यों के लिए डीटीओ के खिलाफ बाध्य करें और फिर डीटीओ को मानचित्र करें, यदि IsValid() आपके मुख्य मॉडल वर्गों में है।

+0

मैं सिर्फ UpdateModel करने की कोशिश की (के बाद से मैं MetadataType एक अंतरफलक पर नहीं डाल सकते हैं) और यह कुछ भी नहीं बदलता है। मैंने एक अस्थायी सत्यापनकर्ता बनाया है और ऐसा लगता है कि यह कभी भी IsValid विधि को हिट नहीं करता है। अद्यतन परिदृश्य के लिए, मुझे यकीन नहीं है कि मैं आपका अनुसरण करता हूं। यदि आपके पास ब्लॉग या उदाहरणों के अच्छे लिंक हैं, तो यह मुझे शुरू करने के लिए पर्याप्त होगा। आपके इनपुट के लिए धन्यवाद! –

+0

क्या आप अधिक कोड पोस्ट कर सकते हैं? मैं इस बात पर स्पष्ट नहीं हूं कि आप अब क्या करने की कोशिश कर रहे हैं। – jfar

+0

नया उत्तर टिप्पणी: विशेषताएं क्लाइंट-साइड हैं। मैं स्वत: जेनरेट की गई वस्तुओं में उचित विशेषताओं को जोड़ने के लिए आंशिक कक्षाओं का उपयोग करता हूं। –

0

आप कैसे जानते हैं कि सत्यापन को नहीं कहा जा रहा है? क्या आप अपने अद्यतन नियंत्रक में ModelState.IsValid की जांच कर रहे हैं और यह पता लगा रहे हैं कि यह गलत तरीके से वापस आ रहा है?

एक ठेठ अद्यतन पैटर्न है:

UpdateModel(model); 
if(!ModelState.IsValid) return View(model); 
return RedirectToAction("Index"); 

आप अपने मॉडल पर कुछ "अगर है" उम्मीद कर रहे हैं, तो स्वचालित रूप से कहा जाता था, कि नहीं होगा। डेटा एनोटेशन कंट्रोलर बेस क्लास पर मॉडलस्टेट डिक्शनरी के साथ दृश्यों के पीछे काम करता है।

+0

ModelState.IsValid हमेशा सत्य है, भले ही मैं एक कस्टम सत्यापन विशेषता डालता हूं जो हमेशा झूठी रिटर्न देता है। उस सत्यापन विशेषता में एक ब्रेकपॉइंट कभी भी हिट नहीं होता है। यह काम करता है अगर मैं सही प्रकार के सत्यापन को इंटरफ़ेस पर रखता हूं। मैं एक सेकंड में अधिक कोड पेस्ट करने जा रहा हूँ। –

+0

क्या आपने अपनी कक्षा घोषणा पर अपना मेटाडेटा प्रकार विशेषता रखने का प्रयास किया है? उदाहरण: इंटरफ़ेस IDataObject {... dataannotations शामिल ...} [MetadataType (typeof (IDataObject))] वर्ग DataObject {....} – kmehta

+0

मेहता एक ही समस्या है। यह काम करता है अगर मैं इंटरफ़ेस पर डेटाअनोटेशन डालता हूं, लेकिन मैं मूल वर्ग/इंटरफ़ेस से सत्यापन को डुप्लिकेट नहीं करना चाहता हूं। –

1

अपने आंशिक वर्ग में IDataErrorInfo इंटरफ़ेस को लागू आप प्रत्येक खाने

आप कोड उदाहरण की जरूरत है तो मुझे पता है (जहां प्रत्येक आवश्यक संपत्ति मान्य करने के लिए डेटा एनोटेशन वर्ग का उपयोग कर सकते हैं) के लिए कस्टम सत्यापन लिखने के लिए होगा। मैं इसे तुम्हारे लिए लिखूंगा!

स्रोत: http://www.asp.net/(S(pdfrohu0ajmwt445fanvj2r3))/learn/mvc/tutorial-37-cs.aspx

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