2012-09-18 8 views
48

Questo è il mio modello:O ErrorMessageString o ErrorMessageResourceName devono essere impostati, ma non entrambi errore utilizzando CreditCardAttribute

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

Questo è il mio Messages.resx:

Nome Valore

CardNumberInvalid controllare la scheda il numero è corretto

E questa è la mia opinione:

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

In MVC versione 3 questo funziona senza errori. In MVC 4, quando vado in questa pagina, ricevo un'escrizione che dice "O ErrorMessageString o ErrorMessageResourceName deve essere impostato, ma non entrambi". Questo sta accadendo solo con CreditCardAttribute. Altri attributi di convalida come RequiredAttribute funzionano correttamente. Ho solo impostato ErrorMessageResourceName. Non ho impostato ErrorMessageString, quindi non capisco cosa ho fatto di sbagliato. Qualcuno può aiutare, per favore?

risposta

147

È un problema noto in .Net 4.5. L'aggiunta del parametro denominato "ErrorMessage = null" dovrebbe risolvere questo problema.

Riferimento: Il link di riferimento è interrotto ora. http://connect.microsoft.com/VisualStudio/feedback/details/757298/emailaddress-attribute-is-unable-to-load-error-message-from-resource-mvc

+24

Ho ricevuto lo stesso errore durante l'utilizzo della nuova annotazione di dati 'EmailAddress'. Questo ha risolto il problema con successo. Grazie! –

+1

Ma ciò rimuoverà anche i messaggi di errore personalizzati impostati. Controlla la risposta di Ians per un modo infallibile! http://stackoverflow.com/a/16211476/268091 – MEMark

+0

@MEMark questo era in risposta alla necessità di impostare un messaggio di errore direttamente dalla risorsa. Non sono sicuro di aver capito il riferimento a un messaggio di errore personalizzato. –

-1

Ho avuto questo stesso problema su una proprietà che stavo localizzando. Avevo definito l'ErrorMessageResourceType e poi l'ErrorMessageResourceName ma per errore mettere l'atrtribute ErrorMessage su come bene che ha generato l'eccezione

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

Quindi, nel mio caso, semplicemente rimuovendo ErrorMessage ho risolto il problema.

+1

Questo è abbastanza ovvio quando si guarda l'errore. L'OP non ha avuto tuttavia l'impostazione 'ErrorMessage', quindi non dovrebbe aver dato l'errore. Il motivo per cui è stato eseguito è un bug negli stessi attributi di Annotazione dei dati, come menzionato da [@DipenBhikadya] (http://stackoverflow.com/a/12488268/1682559). Il tuo problema risolve davvero il tuo problema quando togli il 'ErrorMessage', che era abbastanza chiaro dall'errore dato, ma è un problema diverso (con lo stesso messaggio di errore) come OP. –

10

Ho avuto questo problema perché avevo implementato un RequiredAttributeAdapter, che stava impostando automaticamente la proprietà ErrorMessageResourceName.

È possibile risolvere il problema da controllare per vedere se la proprietà ErrorMessage è stata impostata prima di impostare l'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

Questo è perfetto! Sono stato in giro da molto tempo con le proprietà degli attributi senza successo. – MEMark

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

Aggiunta del ErrorMessage = null risolverà il vostro problema.

0

Poiché chiunque utilizzi gli attributi di convalida personalizzati e desidera caricare anche i messaggi di errore dalle risorse per scopi di localizzazione, affronterà questo problema condividendo la mia soluzione qui.
supporre che si dispone di un attributo di convalida personalizzato come questo

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

nella vostra convalida attributo personalizzato aggiungere questo codice

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

ValidFileType è il nome di una proprietà che prende l'argomento di input di costume attributo di convalida (jpg qui), bene ora possiamo decorare la nostra proprietà del modello nel modo in cui ci piace che sia

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

come vedete, non è più necessario aggiungere ErrorMessage=null perché ci siamo presi cura di esso nella classe di convalida personalizzata. non dimenticare di aver inizializzato qualsiasi stringa di messaggi di errore nella convalida personalizzata, devi rimuoverlo ora e utilizzare invece FormatErrorMessage.

0

Ho riscontrato un problema simile con un ValidationAttribute personalizzato.

Nel metodo IsValid stavo impostando ErrorMessage. La correzione era di rimuovere l'assegnazione alla propety ErrorMessage ...

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; 
} 

ero scrittura di prova Unità e stavano pasisng solo se ero in esecuzione/debug uno per uno. Ma quando faccio clic su "Esegui tutto", solo il primo stava passando? Essi non sono collegati in alcun modo ...

Quindi sì, è sufficiente rimuovere il togliere l'assegnazione alla propety ErrorMessage

spero che aiutare qualcuno!

Problemi correlati