2011-04-13 11 views
5

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

[MetadataType(typeof(ExceptionLogModel.EmailRecipientMetadata))] 
public class EmailRecipientViewModel 
{ 
    public int EmailRecipientID { get; set; } 

    [Remote("ValidateEmailRecipientNameUniqueness", "EmailRecipient", ErrorMessage = "Name is not unique.")] 
    public string Name { get; set; } 

    [Remote("ValidateEmailRecipientEmailUniqueness", "EmailRecipient", ErrorMessage = "Email is not unique.")] 
    public string Email { get; set; } 
} 

public class EmailRecipientChoices 
{ 
    public List<EmailRecipient> UnselectedEmailRecipients { get; set; } 
    public List<EmailRecipient> SelectedEmailRecipients { get; set; } 
    public EmailRecipientViewModel EmailRecipient { get; set; } 
} 

जब इन सत्यापन ब्राउज़र में गति प्रदान, दो अलग अलग अनुरोधों पर कौन सी क्लास में इस्तेमाल किया दृश्य के आधार बना रहे हैं। आप देख सकते हैं कि क्वेरी स्ट्रिंग पैरामीटर नाम अलग हैं:

public JsonResult ValidateEmailRecipientNameUniqueness(string name) 
{ 
    var isValid = !_emailRecipientRepo.NameExists(name); 

    return Json(isValid, JsonRequestBehavior.AllowGet); 
} 

जब दूसरा URL प्रयोग किया जाता है:

http://localhost:55327/EmailRecipient/ValidateEmailRecipientNameUniqueness?Name=sdhsdgh 

http://localhost:55327/EmailRecipient/ValidateEmailRecipientNameUniqueness?EmailRecipient.Name=sdhsdgh 

यहाँ जो दूसरी यूआरएल के साथ काम नहीं करता है मेरी कार्रवाई विधि के वर्तमान संस्करण है , नाम पैरामीटर शून्य होगा। मैंने पढ़ा है कि मुझे उस पैरामीटर में बाइंड विशेषता जोड़ने और उपसर्ग जोड़ने में सक्षम होना चाहिए, लेकिन यह या तो काम नहीं कर रहा है। मैंने उपसर्ग को EmailRecipient. पर सेट करने की कोशिश की, बस इसे डॉट की आवश्यकता होने पर। मैंने इसे नाम में पूंजी एन के साथ भी कोशिश की। नही जाओ। इसे जोड़ने से यह अन्य यूआरएल के लिए भी टूट जाता है!

public JsonResult ValidateEmailRecipientNameUniqueness([Bind(Prefix = "EmailRecipient")] string name) 

संभावित समाधान

मैं विधि EmailRecipientViewModel का एक उदाहरण लेते हैं और इसके लिए एक IModelBinder बनाने जिसमें मैं या तो नामकरण सम्मेलन के लिए देखने के लिए और उदाहरण के लिए यह आवंटित कर सकते हैं हो सकता था। यह ऐसा होना चाहिए जितना काम करना चाहिए।

मैं @Html.EditorFor() के लिए अधिभार इस्तेमाल कर सकते हैं और "नाम" का उपयोग करने के htmlFieldName के लिए यह बताना, और भी ValidationMessageFor बजाय @Html.ValidationMessage("Name") का उपयोग करें। इसका एकमात्र नकारात्मक पक्ष संभावित नामकरण संघर्ष है, लेकिन यह एक सौदा का बड़ा नहीं है। मुझे इस कक्षा के इस्तेमाल के सभी उदाहरणों के लिए सिर्फ एक अद्वितीय नाम का उपयोग करना होगा। अद्यतन: दरअसल, अगर मैं ऐसा करता हूं, तो जब मैं फॉर्म पोस्ट करता हूं तो चीजें तोड़ती हैं क्योंकि मैंने नाम बदल दिए हैं। यह अच्छा नहीं है।

...

मैं सिर्फ पता लगा मैं विधि हो सकता है कोई पैरामीटर नहीं है, और मैन्युअल रूप से क्वेरी स्ट्रिंग का उपयोग। यह एक बहुत ही सरल समाधान है, लेकिन मुझे अच्छा पैरामीटर नहीं मिलता है।

string name = Request.QueryString[ "Name" ] ?? Request.QueryString[ "EmailRecipient.Name" ]; 

यह इतना आसान है कि मैं शायद इसका उपयोग करने जा रहा हूं। हालांकि, चूंकि मेरे पास पहले से ही यह प्रश्न टाइप है, मैं पूछूंगा, क्या कोई और शानदार समाधान है?

उत्तर

1

अपने स्वयं के सत्यापन या मॉडल बाइंडर को घुमाने के बिना ऐसा करने का वास्तव में एक साफ तरीका नहीं है। मॉडल बाइंडिंग की तरह सोचें, मॉडल बाइंडर को रिमोट सत्यापन के लिए क्या आ रहा है, इसका नाम जानने की जरूरत है। एक दृष्टिकोण जो आप ले सकते हैं वह है अपने नियंत्रक में दो अलग-अलग रिमोट सत्यापन विधियां बनाना जो एक विधि को कॉल करना समाप्त करता है जो वास्तव में सभी सत्यापन कार्य करता है।

1

ठीक है, मैं जानता हूँ कि यह देर हो चुकी है, लेकिन वहाँ एक और अधिक सुरुचिपूर्ण समाधान है:

public JsonResult ValidateEmailRecipientNameUniqueness (EmailRecipient recipient) 
{ 
    string name = recipient.Name; 
    var isValid = !_emailRecipientRepo.NameExists(name); 
    return Json(isValid, JsonRequestBehavior.AllowGet); 
} 

दूसरे शब्दों में, मॉडल ही इस्तेमाल करते हैं। यह name संपत्ति को सही ढंग से बांध देगा और आपको केवल इस मान की आवश्यकता होगी।

+0

यह तब काम नहीं करता जब टेक्स्ट बॉक्स का नाम केवल "नाम" रखा जाता है। यही समस्या है।मेरे पास दो अलग-अलग टेक्स्ट बॉक्स थे जो दोनों एक ही सत्यापन विधि को उपयोगकर्ता बनाना चाहते थे। – Glazed

+0

मैंने अभी अपनी तरफ से इसका परीक्षण किया है। मैंने फिडलर का इस्तेमाल किया और मैं पुष्टि कर सकता हूं: यह बिना किसी उपसर्ग के काम करता है। – SmartDev

+0

@Glazed 5.0.0 ... – SmartDev

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

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