2013-02-21 9 views
8

miałem następujący kod:ASP.NET MVC4: Argument atrybut musi być stałym wyrażeniem, typeof ekspresji lub tworzenia tablicy wyrażenia typu parametru atrybut

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

Próbuję zrobić komunikat błędu dynamicznego ale pojawia się błąd, gdy skompilowany .:

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

żadnego rozwiązania tego problemu?

+0

Sprawdź to pytanie: http://stackoverflow.com/questions/3814866/dynamic-parameters-for-attributes –

+1

Co prowadzi do postu przez Eric Lippert: http://blogs.msdn.com/b/ericlippert/ archiwum/2009/02/02/properties-vs-attributes.aspx –

+0

możliwy duplikat [Argumenty atrybutów dynamicznych] (http://stackoverflow.com/questions/1093466/c-sharp-dynamic-attribute-arguments) – jgauffin

Odpowiedz

3

Komunikat o błędzie informuje, że "argument atrybutu musi być stałym wyrażeniem ...".

Oznacza to, że argument atrybutu DisplayName musi być wyrażeniem stałym (takim jak ciąg, liczba całkowita itp.

Jeśli chcesz zlokalizować obiekt to trzeba atrybut, który obsługuje it.If używasz ASP.Net 4 następnie DisplayAttribute powinno być tak:

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

Także proszę sprawdzić to answer z Darin

+1

translateMessage ("id") nie jest typem, więc myślę, że to nie działa – MiaoWin

9

Najpierw utworzysz plik Resource .resx, który będzie zawierał zlokalizowane ciągi.

Po zadeklarowaniu tego atrybutu ustawiono argument ResourceType. Powoduje to, że argumenty Name, ShortName i Description są używane jako klucz zasobów zamiast wartości.

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

Odpowiadając bardzo późno.

Wartości parametrów DataAnnotations wymagają stałych, rzeczywistych ciągów. Nie można tutaj zapisać metody. Czy potrzebujesz jakiejkolwiek lokalizacji, a następnie utwórz plik zasobów. Następnie napisz coś w tym stylu. Tutaj "RequiredField" i "Email" są kluczem utworzonym w pliku zasobów, a "ViewModelResource" to nazwa pliku zasobów.

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

Jeśli chcesz niestandardowy komunikat na temat warunków, a następnie utworzyć własne "Custom DataAnnings" zależy od warunków.