2013-02-21 3 views
8

ho avuto il seguente codice:ASP.NET MVC4: Un argomento attributo deve essere un'espressione costante, typeof espressione o la creazione di matrice espressione di un tipo di parametro di attributo

[Required(ErrorMessage = MessageModel.translateMessage("required")))] 
    [Display(Name= MessageModel.translateMessage("id"))] 
    public string user_id { get; set; } 

Sto cercando di rendere il messaggio di errore dinamica ma ottengo l'errore durante la compilazione .:

"An attribute argument must be a constant expression , typeof expression or array creation expression of an attribute parameter type."

Qualsiasi soluzione per questo problema?

+0

Dai un'occhiata a questa domanda: http://stackoverflow.com/questions/3814866/dynamic-parameters-for-attributes –

+1

Quale porta a postare da Eric Lippert: http://blogs.msdn.com/b/ericlippert/ archivio/2009/02/02/properties-vs-attributes.aspx –

+0

possibile duplicato di [C# Dynamic Attribute Arguments] (http://stackoverflow.com/questions/1093466/c-sharp-dynamic-attribute-arguments) – jgauffin

risposta

3

Il messaggio di errore dice "un argomento di attributo deve essere un'espressione costante ...".

Significa che l'argomento dell'attributo DisplayName deve essere un'espressione costante (come una stringa, un numero intero, ecc.) O uno qualsiasi degli altri tipi di espressioni elencati nel messaggio di errore.

Se volete localizzare una proprietà, allora avete bisogno di un attributo che supporta it.If si utilizza ASP.Net 4 poi DisplayAttribute dovrebbe essere come questo:

[Display(Name="ID",Resource=typeof(MessageModel.translateMessage("id")))] 
public string user_id { get; set; } 

Inoltre si prega di controllare questo answer da Darin

+1

translateMessage ("id") non è un tipo quindi penso che non funzioni – MiaoWin

9

Prima di creare un file .resx di risorsa questo conterrà le stringhe localizzate.

Quando si dichiara l'attributo, si imposta l'argomento ResourceType. Ciò causa gli argomenti Name, ShortName e Description da utilizzare come una chiave di risorsa anziché un valore.

[Display(Name = "GenreName", ShortName = "GenreShortName", Description = "GenreDescription", ResourceType = typeof(MyResources))] 
public string Genre { get; set; } 
2

Rispondere molto tardi.

I valori dei parametri DataAnnotations richiedono costanti, stringhe effettive. Quindi, non puoi scrivere qui un metodo. È necessario qualsiasi tipo di localizzazione, quindi creare un file di risorse. Quindi scrivi un codice come questo. Qui "RequiredField" e "Email" sono la chiave creata nel file di risorse e "ViewModelResource" è il nome del file di risorse.

[Required(ErrorMessageResourceName = "RequiredField", ErrorMessageResourceType = typeof(ViewModelResource))] 
[Display(Name = "Email", ResourceType=typeof(ViewModelResource))] 
public string Email{ get; set; } 

Se si desidera un messaggio personalizzato in base alle condizioni, creare le proprie "Annotazioni dati personalizzate" dipende dalle condizioni.