2012-09-18 5 views
48

का उपयोग कर दोनों त्रुटि यह मेरा मॉडल है:या तो ErrorMessageString या ErrorMessageResourceName सेट किया जाना चाहिए, लेकिन नहीं CreditCardAttribute

namespace MvcApplication2.Models 
{ 
    public class CreditCard 
    { 
     [CreditCard(ErrorMessageResourceType = typeof(Messages), ErrorMessageResourceName = "CardNumberInvalid")] 
     public string CardNumber { get; set; } 
    } 
} 

यह मेरा Messages.resx है:

नाम मूल्य

CardNumberInvalid आपके कार्ड की जाँच करें संख्या सही है

और यह मेरा विचार है:

@model MvcApplication2.Models.CreditCard 
@Html.TextBoxFor(m => m.CardNumber); 

एमवीसी संस्करण 3 में यह त्रुटि के बिना काम करता है। एमवीसी 4 में जब मैं इस पृष्ठ पर जाता हूं तो मुझे यह कहते हुए एक उत्साह मिलता है कि "या तो त्रुटि मैसेजस्ट्रिंग या त्रुटि मैसेज रिसोर्सनाम सेट होना चाहिए, लेकिन दोनों नहीं"। यह केवल क्रेडिट कार्ड एट्रिब्यूट के साथ हो रहा है। अन्य मान्यताओं विशेषताओं जैसे RequiredAttribute काम ठीक है। मैंने केवल ErrorMessageResourceName सेट किया है। मैंने ErrorMessageString सेट नहीं किया है, इसलिए समझ में नहीं आया कि मैंने क्या किया है। क्या कोई मदद कर सकता है?

उत्तर

147

यह नेट 4.5 में ज्ञात समस्या है। "ErrorMessage = null" नाम पैरामीटर को जोड़ना इसे हल करना चाहिए।

संदर्भ: संदर्भ लिंक अब टूट गया है। http://connect.microsoft.com/VisualStudio/feedback/details/757298/emailaddress-attribute-is-unable-to-load-error-message-from-resource-mvc

+24

मुझे 'ईमेल एड्रेस' डेटा एनोटेशन का उपयोग करते समय भी यही त्रुटि मिली। इसने सफलतापूर्वक समस्या हल की। धन्यवाद! –

+1

लेकिन इससे कोई भी कस्टम त्रुटि संदेश सेट भी हटा दिया जाएगा। बेवकूफ साबित करने के लिए इन्स का जवाब देखें! http://stackoverflow.com/a/16211476/268091 – MEMark

+0

@MEMark यह संसाधन से सीधे त्रुटि संदेश सेट करने की आवश्यकता के जवाब में था। निश्चित नहीं है कि मैं एक कस्टम त्रुटि संदेश के संदर्भ को समझता हूं। –

-1

मुझे ऐसी संपत्ति पर एक ही समस्या थी जो मैं स्थानीयकरण कर रहा था। मैं ErrorMessageResourceType और फिर ErrorMessageResourceName परिभाषित किया था, लेकिन गलती से साथ ही जो सिर्फ ErrorMessage को हटाने मैं समस्या का समाधान होने से मेरे मामले में अपवाद

[NotEqualTo("User_Name", ErrorMessageResourceType = typeof(LROResources.Global), ErrorMessageResourceName = "UserPasswordCannotBeUsername", ErrorMessage = "The password cannot be the same as your Username.")] 

तो फेंक दिया पर त्रुटिसंदेश atrtribute डाल दिया।

+1

जब आप त्रुटि को देखते हैं तो यह बहुत स्पष्ट है। हालांकि ओपी में 'त्रुटि संदेश' सेट नहीं था, इसलिए इसे त्रुटि नहीं दी जानी चाहिए थी। [@DipenBikadya] (http://stackoverflow.com/a/12488268/1682559) द्वारा वर्णित अनुसार, डेटा एनोटेशन विशेषताओं में यह एक कारण है। जब आप 'त्रुटि संदेश' को हटाते हैं, तो आपकी समस्या वास्तव में आपकी समस्या को ठीक करती है, जो दी गई त्रुटि से बहुत स्पष्ट थी, लेकिन ओपी के रूप में यह एक अलग समस्या है (उसी त्रुटि संदेश के साथ)। –

10

मुझे यह समस्या थी क्योंकि मैंने RequiredAttributeAdapter लागू किया था, जो स्वचालित रूप से ErrorMessageResourceName प्रॉपर्टी को सेट कर रहा था।

आप देखने के लिए अगर त्रुटिसंदेश संपत्ति ErrorMessageResourceName सेट करने से पहले स्थापित किया गया है की जाँच करके इसे ठीक कर सकते हैं:

/// <summary> 
/// Creates a new instance of the RequiredAttributeAdapter, used for switching the default required message 
/// format 
/// </summary> 
public CustomMessageRequiredAttributeAdapter(
    ModelMetadata metadata, 
    ControllerContext context, 
    RequiredAttribute attribute 
) 
    : base(metadata, context, attribute) 
{ 
    if (string.IsNullOrEmpty(attribute.ErrorMessage)) 
    { 
     attribute.ErrorMessageResourceType = typeof (ValidationMessages); 
     attribute.ErrorMessageResourceName = "PropertyValueRequired"; 
    } 
} 
+0

यह सही है! मैं सफल होने के बिना विशेषता गुणों के साथ लंबे समय से बेवकूफ़ बना रहा था। – MEMark

13
[CreditCard(ErrorMessageResourceType = typeof(Messages), ErrorMessageResourceName = "CardNumberInvalid", ErrorMessage = null)] 

ErrorMessage = null शामिल करने से आपकी समस्या का समाधान हो।

0

चूंकि कोई भी कस्टम सत्यापन गुणों का उपयोग कर रहा है और स्थानीयकरण उद्देश्यों के लिए संसाधनों से त्रुटि संदेशों को लोड करना चाहता है, तो इस समस्या का सामना करना होगा, मैं यहां अपना कामकाज साझा करता हूं।
मान आप अपने कस्टम सत्यापन में यह एक

[FileTypeMustBe("jpg")] 
public HttpPostedFileBase MyFile {get; set;} 

की तरह एक कस्टम मान्यता विशेषता है कि विशेषता इस कोड

public override string FormatErrorMessage(string name) 
    { 
     return String.Format(CultureInfo.CurrentCulture, 
      ErrorMessageString, name, ValidFileType); 
    } 

ValidFileType एक संपत्ति जो कस्टम के इनपुट तर्क लेता का नाम है जोड़ने सत्यापन विशेषता (यहां जेपीजी), अब हम अपनी मॉडल संपत्ति को सजाने के तरीके को

[FileTypeMustBe("jpg", ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "WrongFileTypeError")] 
public HttpPostedFileBase MyFile {get; set;} 

जैसा कि आप देखते हैं कि ErrorMessage=null जोड़ने की कोई आवश्यकता नहीं है क्योंकि हमने कस्टम सत्यापन वर्ग में इसकी देखभाल की है। बस भूलें कि आपने अपने कस्टम सत्यापन में कोई त्रुटि संदेश स्ट्रिंग शुरू की है, तो आपको इसे अभी हटा देना होगा और इसके बजाय FormatErrorMessage का उपयोग करना होगा।

0

मुझे कस्टम सत्यापन प्रमाणीकरण के साथ एक समान समस्या थी।

IsValid विधि में मैं त्रुटि संदेश सेट कर रहा था। ठीक त्रुटिसंदेश propety को अर्पण दूर करने के लिए ...

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
{ 
    //code before ... 
    this.ErrorMessage = this.FormatErrorMessage(validationContext.DisplayName); //NOT GOOD... 
    ValidationResult validationResult = new ValidationResult(this.ErrorMessage, //And using the ErrorMessage Here... 
     new[] { validationContext.MemberName }); 
    return validationResult; 
} 

मैं यूनिट परीक्षण writting किया गया था और वे pasisng थे केवल अगर मैं चल रहा था/डिबगिंग एक एक करके किया गया था। लेकिन जब मैं "सभी चलाएं" पर क्लिक करता हूं, तो केवल पहला ही गुज़र रहा था? वे किसी भी तरह से जुड़े हुए नहीं हैं ...

तो, हाँ, बस हटाने त्रुटिसंदेश propety

मुझे आशा है कि यह किसी को मदद मिलेगी के लिए नियुक्ति को दूर!

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

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