2015-07-29 7 views
5

साथ बाइंडिंग मैं एक सदस्य toBeRemoteChecked और एक सदस्य valueToMap के साथ एक मॉडल MapToA के साथ एक मॉडल ModelA है। जब भी मैं ModelA का उदाहरण बनाता हूं, मुझे MapToA का एक उदाहरण भी चाहिए, इसलिए मेरे पास एक मॉडल CreateModelA है जिसमें एक सदस्य modelA और सदस्य valueToMap शामिल है। जब फॉर्म सबमिट किया जाता है, तो मैं डेटाबेस तालिका ModelA में जोड़ता हूं और MapToA पर एक उदाहरण बना और जोड़ता हूं जिसमें modelA और valueToMap की आईडी शामिल होती है। कोड की शर्तें मेंASP.NET MVC रिमोट मान्यता

public class ModelA 
{ 
    [Key] 
    public int ID { get; set; } 
    [Required, Remote("isValid", "MyController", ErrorMessage = "not valid")] 
    public string toBeRemoteChecked { get; set; } 
} 

public class MapToA 
{ 
    [Key] 
    public int Map_ID { get; set; } 
    [Required] 
    public int modelAID { get; set; } 
    [Required] 
    public int valueToMap { get; set; } 
} 

public class CreateModelA 
{ 
    public ModelA modelA { get; set; }; 
    public int valueToMap { get; set; }; 
} 

जब मैं ModelA की घटना को, MapToA में मानों कोई फर्क नहीं है (और ज्यादातर मामलों में एक ही modelA आईडी के साथ mapToA के एक से अधिक उदाहरण नहीं है), लेकिन के दूरदराज के सत्यापन toBeRemoteChecked महत्वपूर्ण बना हुआ है।

मेरे समस्या: सत्यापन विधि के लिए बाध्यकारी:

public ActionResult isValid(string toBeRemoteChecked) { ... } 

अगर मैं इसे छोड़ के रूप में यह है, यह जब एक ModelA संपादन काम कर रहा है, लेकिन नहीं है जब मैं के माध्यम से CreateModelA एक ModelA (मैं हमेशा बना रहा हूं toBeRemoteChecked में शून्य मान प्राप्त करें)। जब मैं BindPrefix

public ActionResult isValid([Bind(Prefix = "modelA.toBeRemoteChecked")] string toBeRemoteChecked) { ... } 

का उपयोग जब मैं एक ModelA बनाने यह काम कर रहा है, लेकिन जब मैं इसे संपादित कर रहा हूँ नहीं।

जब मैं एक ... @Name = "toBeRemoteChecked" ... जोड़ने @Html.TextBoxFor की htmlAttributes में (modelA.toBeRemoteChecked कि HTML सहायक द्वारा बनाई गई है के बजाय) द्वारा Create.cshtml में "नाम" को बदलने की कोशिश, तो मान्यता काम कर रहा है, लेकिन के बंधन तालिका का मान गुम हो जाता है और जब मान डेटाबेस (शून्य मान) में सहेजे जाते हैं तो मुझे त्रुटि मिलती है।

तो, मैं बनाने और संपादित करने के लिए विभिन्न बाध्यकारी कैसे प्राप्त करूं?

अब तक, मेरी वैकल्पिक हल ModelA और CreateModelA: IValidatableObject बनाने के लिए और मेरी public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) विधि में सदस्य toBeRemoteChecked जाँच करने के लिए है। लेकिन वह फ़ॉर्म के शीर्ष पर त्रुटि संदेशों को प्रदर्शित करता है, न कि TextFor बॉक्स के स्थान पर।

तो: सबसे अच्छा समाधान: बाध्यकारी कैसे करें कि रिमोट सत्यापन दोनों मामलों में कैसे काम करता है?

दूसरा सबसे अच्छा: कैसे जहां यह के अंतर्गत आता है IValidatableObject वस्तु के पास की त्रुटि संदेश प्रदर्शित (और जमा करने के बाद नहीं, दाहिने हाथ पर त्रुटि संदेश प्राप्त)

विभिन्न विचारों या समाधान करने के लिए: आपका स्वागत है।

धन्यवाद।

उत्तर

1

मुझे विरासत के बिना समाधान मिला (और बिना मॉडल के) जो मेरे बाध्यकारी समस्या को मेरे कोड में थोड़ा बदलाव के साथ हल करता है।

वहाँ दूरदराज के सत्यापन के लिए बाध्यकारी के दो तरीके है, तो आप या तो बस सदस्य है कि दूरदराज के जांच की जानी

public ActionResult isValid(string toBeRemoteChecked) { ... } 

पारित कर सकते हैं या आपको लगता है कि सदस्य के वर्ग का उदाहरण दे सकते हैं।

public ActionResult isValid(ModelA modelA) { ... } 

दूसरे संस्करण के अंदर, निश्चित रूप से, आप modelA.toBeRemoteChecked साथ toBeRemoteChecked को बदलने के लिए। इस दूसरे संस्करण पर बाध्यकारी दोनों मामलों में काम करता है - जब उपरोक्त संदर्भ में ModelA का मेरा उदाहरण बनाते समय संपादन और भी। बाध्यकारी काम करने के लिए, यह महत्वपूर्ण है कि रिमोट सत्यापन विधि का पैरामीटर नाम CreateModelA में सदस्य नाम से मेल खाता है, यानी मेरे मामले में modelA

मामले में आप एक बहुत जटिल मॉडल है, तो आप सिर्फ सदस्यों को आप का उपयोग करके उपयोग करना चाहते हैं के साथ पैरामीटर modelA प्रारंभ कर सकते हैं बाँध/में शामिल हैं, यानी मेरे मामले में मैं का उपयोग करेंगे

public ActionResult isValid([Bind(Include = "toBeRemoteChecked")] ModelA modelA) { ... } 

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

3

एक दिलचस्प समस्या, और this question के समान, जिसके परिणामस्वरूप मैंने कोडेप्लेक्स में एक समस्या की सूचना दी, लेकिन इसे अभी तक हल नहीं किया गया है। इस लिंक में jquery.validate.js फ़ाइल में एक सुझाया गया संशोधन शामिल है जो इसे हल करेगा (यह उपसर्ग को स्ट्रिप्स करता है) लेकिन इसका मतलब है कि जब भी आप स्क्रिप्ट को अपडेट करते हैं तो आपको इसे बनाए रखने की आवश्यकता होगी, इसलिए वास्तव में वांछनीय नहीं है।

एक विकल्प तो यह है कि आप एक उपसर्ग की आवश्यकता नहीं है CreateModelA बदलने के लिए ModelA से विरासत और बस int valueToMap संपत्ति जोड़ने होगा - अपने हमेशा @Html.TextBoxFor(m => m.modelA.toBeRemoteChecked)

इसके अलावा के बजाय @Html.TextBoxFor(m => m.toBeRemoteChecked) का उपयोग कर, [Remote] ग्राहक के पक्ष केवल मान्यता है, जो इसका मतलब है कि जब भी आप पोस्ट करते हैं तो आपको सर्वर में सत्यापन करने की आवश्यकता होती है। तो आप केवल यह स्वीकार कर सकते हैं कि आपके पास संपत्ति के लिए क्लाइंट साइड सत्यापन नहीं है, और इसके बजाय संपत्ति के लिए POST विधियों में ModelState त्रुटि जोड़ें और दृश्य को वापस करें ताकि यह संबंधित ValidationMessageFor() तत्व

में प्रदर्शित हो

साइड नोट: तथ्य यह है कि आपके मॉडल में [Key] विशेषता है, यह सुझाव देता है कि यह एक डेटा मॉडल है, दृश्य मॉडल नहीं है, और [Remote] एक दृश्य विशिष्ट विशेषता है। आपको दृश्य मॉडल का उपयोग करना चाहिए, विशेष रूप से डेटा संपादित करते समय। (What is ViewModel in MVC? देखें)

+0

धन्यवाद। क्लाइंट साइड सत्यापन के लिए, मैंने उत्तराधिकारी विकल्प की कोशिश की - एक डेमो प्रोजेक्ट भी काम कर रहा था, लेकिन जब मैं 'db.ModelAset.Add (createModelA) जोड़ें 'मैं या तो डेटाबेस में स्वचालित रूप से जोड़े गए अवांछित अतिरिक्त कॉलम के साथ समाप्त होता हूं या मुझे मिलता है डेटाबेस से उन स्तंभों को मैन्युअल रूप से हटाए जाने के बाद 'अवैध कॉलम नाम' त्रुटि। मैं 'db.ModelAset.Add (modelA) 'कर सकता हूं, जब मैं सभी आवश्यक सदस्यों को' createModelA' से 'modelA' में कॉपी करके मैन्युअल रूप से' मॉडलए 'बनाता हूं। क्या इसके लिए कोई छोटा सा कट है? (मेरे असली मॉडल में लगभग 20 सदस्य हैं, इसलिए यह संभव है, लेकिन बहुत अच्छा नहीं है)। धन्यवाद। – outofmind

+0

आपको अपना अंतिम पैराग्राफ दोबारा पढ़ने की जरूरत है :) एक व्यू मॉडल का डेटाबेस से कोई संबंध नहीं है। –

+0

ठीक है।तो मुझे दृश्य मॉडल से डेटा मॉडल में डेटा को स्थानांतरित करते समय अतिरिक्त प्रयास है, आपकी मदद के लिए धन्यवाद :-) – outofmind