2009-09-26 12 views
7

Ho ValidationAttribute come:ASP.NET MVC: ValidationAttribute e localizzato ErrorMessage

public class Username : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
    if (value == null) 
    return false; 

    return RegExp.Validate(RegExpLib.Username,value.ToString()); 
    } 
} 

..e utilizza in questo modo:

public class AccountSignIn 
{ 
    [Username(ErrorMessageResourceName ="txtUsername",ErrorMessageResourceType=typeof(SignIn))] 
    public string Username { get; set; } 

    public string Password { get; set; } 

    public bool RememberMe { get; set; } 

    public string ReturnUrl { get; set; } 
} 

SignIn è file di risorse a App_GlobalResources e "txtUsername" - è il nome della stringa nel file di risorse.

Problema: I messaggi di errore non sono visualizzati.

Domanda: Come impostare un messaggio di errore se ho poche lingue sul sito web.

Un altro Info:

Io sono in grado di accedere SignIn.txtUsername da Vista o qualsiasi file nel progetto. Dal regolatore

ModelState.AddModelError("Username", Resources.SignIn.txtUsername); 

funziona bene così .. posso assegnare ErrorMessage all'interno ValidationAttribute, ma ha ottenuto l'errore dopo la seconda convalida provare ... se metto verificare come questo -

if(ErrorMessage != Resources.SignIn.txtUsername) 
     ErrorMessage = Resources.SignIn.txtUsername; 

ho errore dopo Passare a un'altra lingua - ErrorMessage può essere assegnato solo una volta.

Si prega di consigli su come posso risolverlo.

Grazie in anticipo.

risposta

1

Assicurarsi che nell'editor delle risorse la visibilità della risorsa sia impostata su "Pubblico" e non su "Interno". Altrimenti il ​​riflesso fatto da DataAnnotations non funzionerà.

+0

Come ho scritto, sto utilizzando le risorse globali "SignIn è file di risorse su App_GlobalResources" –

+0

Sfortunatamente, non è possibile rendere pubbliche le risorse in App_GlobalResources. È necessario utilizzare il file di risorse dalla cartella "Proprietà" invece - fare clic con il tasto destro del mouse sul progetto, selezionare Proprietà, dal menu a sinistra selezionare "Risorse" e fare clic su "questo progetto ...". Verrà creato il file di risorse predefinito denominato "Resources.resx". È possibile rinominarlo (ad esempio "ModelErrors") e utilizzare nel codice: [Obbligatorio (ErrorMessageResourceName = "Password_Required", ErrorMessageResourceType = typeof (Properties.ModelErrors))] – Feryt

+0

Sì, è vero. DataAnnotations esistono per essere utilizzate al di fuori di ASP.NET, quindi non sanno nulla di App_XxxResources e funzionano solo con i file di risorse tradizionali. –

10

Ho avuto alcuni problemi con l'utilizzo di messaggi di errore localizzati e DataAnnotation, praticamente identici alla situazione. Anche se non sono stato visualizzato vuoto come messaggi di errore, ho sempre avuto alcune eccezioni lanciate. Soluzione per me era:

  1. in App_GlobalResources/Errors.resx aprire il file di risorse, modificare le sue proprietà per costruire Azione: Risorsa incorporata, strumento personalizzato: PublicResXFileCodeGenerator, Spazio dei nomi strumento personalizzato: risorse (Visual Studio fa qualcosa di strano in autogenerating questi, in modo da controllare ancora una volta che le cose sono ok)

  2. Modifica modificatore di accesso del file di risorse al pubblico

  3. verificare dal file di codice generato (Errors.Designer.cs) che lo spazio dei nomi e l'accesso modificatore sono corretta.

  4. Prova ora

Il mio esempio dalla classe del modello:

[Required(ErrorMessageResourceType = typeof(Resources.Errors), ErrorMessageResourceName="ResponseMessageRequired")] 
public string message { get; set; } 
0

Questa domanda sembra piuttosto vecchio. Ho avuto un problema simile quando si utilizza resx (il mio archivio dei messaggi di errore) come tipo di parametro attributo nel mio progetto MVC3.

Questo risolto il problema:

  • Set "Messages.resx" - proprietà del file "Build Azione" a "risorsa embedded"
  • Modificare il parametro attributo come segue: [Range(0, 999, ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "ERR_NUM_NOT_IN_RANGE")]

Spero che questo ti aiuti.