2011-02-12 14 views
7

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

इस मामले में मेरे पास एक विक्रेता एड्रेस दृश्य मॉडल है। मैं इस प्रोजेक्ट में कुछ स्थानों में पता (एसएस) का उपयोग करता हूं, इसलिए मैंने मॉडल ऑब्जेक्ट को बनाया और पता लगाया कि मैं फिर से उपयोग कर सकता हूं। तब मुझे उम्मीद थी कि मैं राज्य कोड और ज़िपों की पूरी तरह से जांच करना चाहता हूं, इसलिए मुझे उम्मीद है कि मैं दूरस्थ सत्यापन का उपयोग करने की कोशिश करूंगा और डेटाबेस में टेबल के संग्रहित सेट के बीच राज्य और ज़िप कोड की जांच करूँगा।

समस्या यह है कि मैं उन क्षेत्रों के लिए रिमोट एक्शन विधियों पर वापस मूल्य नहीं प्राप्त कर रहा हूं जिनके लिए मैं पूछ रहा हूं (इस मामले में राज्य और पोस्टलकोड)। मेरा मानना ​​है कि यह इस बात की वजह से है कि एमवीसी ढांचा इस मामले में इनपुट के लिए आईडी (एस) के लिए यौगिक या उप प्रकार के लिए करता है, यह 'पता_लाइन 1' और 'पता_स्टेट' और 'पता_PostalCode' जैसे नाम बना रहा है।

आखिरकार मेरे पास सवाल है, क्या बेस व्यू मॉडल ऑब्जेक्ट से प्री-पेंडेड 'एड्रेस_' को बंद करने का एक तरीका है जिससे एमवीसी फ्रेमवर्क फॉर्म के थर्म पोस्ट के बाद ऑब्जेक्ट में बाक डाल सकता है ?

public class AddressViewModel 
{ 
    [ScaffoldColumn(false)] 
    public int AddressId { get; set; } 
    [Required(ErrorMessage = "Please enter the first address line")] 
    public string Line1 { get; set; } 
    public string Line2 { get; set; } 
    public string Line3 { get; set; } 
    [Required(ErrorMessage = "Please enter a city name")] 
    public string City { get; set; } 
    [Required(ErrorMessage = "Please enter a state 2 letter code")] 
    [StringLength(2)] 
    [Remote("CheckState", "Validation", AdditionalFields = "PostalCode")] 
    public string State { get; set; } 
    [Required(ErrorMessage = "Please enter a postal code")] 
    [Remote("CheckZip", "Validation", AdditionalFields = "State")] 
    [Display(Name = "Zip/Postal Code")] 
    public string PostalCode { get; set; } 
    public string Country { get; set; } 
} 

public class VendorContactViewModel 
{ 
    public int VedorContactId { get; set; } 
    public int ContactVendorId { get; set; } 
    public int ContactId { get; set; } 
    [Required] 
    [Display(Name = "Contact Type")] 
    public byte ContactTypeId { get; set; } 
    public string ContactType { get; set; } 
    [Required] 
    [Display(Name = "Contact Info")] 
    public string ContactInfo { get; set; } 
    [Display(Name = "Contact Label")] 
    public string ContactLabel { get; set; } 
    public IEnumerable<SelectListItem> ContactTypes { get; set; } 
} 
तो रूप में

प्रतिपादन के बाद यह इस तरह दिखता है:

<input type="text" value="" size="2" name="Address.State" maxlength="2" id="Address_State" 
    data-val-required="Please enter a state 2 letter code" data-val-remote-url="/Validation/CheckState" 
    data-val-remote-additionalfields="*.State,*.PostalCode" data-val-remote="&amp;#39;State&amp;#39; is invalid." 
    data-val-length-max="2" data-val-length="The field State must be a string with a maximum length of 2." 
    data-val="true" class="input-validation-error"> 

मैं दूरस्थ कॉल प्राप्त लेकिन "राज्य" पैरामीटर में कुछ भी नहीं है और "PostalCode" वहाँ है, इसलिए विनीत दिनचर्या हैं फायरिंग लेकिन मुझे लगता है कि यह नहीं जानता कि डेटा को कहां देखना है, भले ही मैंने मनोनीत क्षेत्रों में कुछ टाइप किया हो। आप गाया कोड में देख सकते हैं आईडी = "Address_State" और डेटा-वैल-रिमोट additionalfields = ".State, .PostalCode"

अपना समय और प्रयास के लिए धन्यवाद,

Irv

उत्तर

10

एक उपसर्ग निर्दिष्ट करने का प्रयास में मदद करने के मॉडल बांधने की मशीन सही ढंग से उनकी संगत कार्रवाई मापदंडों के Address.PostalCode और Address.State अनुरोध मान बाँध:

public ActionResult CheckState(
    [Bind(Prefix = "Address.State")]string State, 
    [Bind(Prefix = "Address.PostalCode")]string PostalCode 
) 
{ 
    ... 
} 
+6

धन्यवाद डारिन, मैंने यह पता लगाया है लेकिन यह मूल रूप से सही उत्तर है। यद्यपि आपको वास्तव में बाध्य पर संपत्ति की भी आवश्यकता है, जैसे कि [बाइंड (उपसर्ग = "पता.स्टेट")] स्ट्रिंग स्टेट ..... –

+0

धन्यवाद डारिन .. आप कमाल हैं .. :) –

0

मैं टी में भाग उनकी समस्या है, लेकिन अलग-अलग उपसर्गों के साथ कई दृश्यों में एक ही व्यूमोडेल का उपयोग करने की आवश्यकता है। मैंने जावास्क्रिप्ट लिखना समाप्त कर दिया जिसने jQuery रिमोट सत्यापन नियमों को संशोधित किया ताकि उनमें कोई उपसर्ग शामिल न हो:

$('[data-val-remote]').each(function() { 
    // overwrite the remote rule data so that it sends non-prefixed property name to the server 
    var remoteRule = $(this).rules().remote; 
    var newData = {}; 
    var keys = Object.keys(remoteRule.data); 
    for (var i = 0; i < keys.length; i++) { 
     var nonPrefixedPropertyName = $(keys[i].split('.')).last()[0]; 
     newData[nonPrefixedPropertyName] = remoteRule.data[keys[i]]; 
    } 
    remoteRule.data = newData; 
}); 
संबंधित मुद्दे