2009-09-26 14 views
7

mam ValidationAttribute jak:ASP.NET MVC: ValidationAttribute i zlokalizowane ErrorMessage

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

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

..i używając go tak:

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 jest plik zasobów na App_GlobalResources i "txtUsername" - jest nazwą ciągu w pliku zasobów.

Problem: Komunikaty o błędach nie są wyświetlane.

Pytanie: Jak ustawić komunikat o błędzie, jeśli mam kilka języków na stronie internetowej.

Kolejna informacja:

Jestem w stanie dostęp SignIn.txtUsername od Wyświetleń lub dowolny plik w projekcie. Z regulatora

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

działa dobrze, jak dobrze .. mogę przypisać ErrorMessage wewnątrz ValidationAttribute, ale dostałem błąd po drugiej walidacji spróbować ... jeśli I miejsce sprawdzić jak ten -

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

mam błąd po Przełączam na inny język - ErrorMessage można przypisać tylko raz.

Proszę doradzić, jak mogę to rozwiązać.

Z góry dziękuję.

Odpowiedz

1

Upewnij się w edytorze zasobów, że widoczność zasobów jest ustawiona na "Publiczny", a nie "Wewnętrzny". W przeciwnym razie refleksja wykonana przez DataAnnotations nie będzie działać.

+0

Tak jak napisałem, używam zasobów globalnych "SignIn to resource file at App_GlobalResources" –

+0

Niestety, nie można udostępniać zasobów w App_GlobalResources publicznych. Zamiast tego należy użyć pliku zasobów z folderu "Właściwości" - kliknij prawym przyciskiem myszy na projekcie, wybierz właściwości, z lewego menu wybierz "Zasoby" i kliknij "ten projekt ...". Zostanie utworzony domyślny plik zasobów o nazwie "Resources.resx". Możesz zmienić jego nazwę (np. "ModelErrors") i użyć w kodzie: [Wymagane (ErrorMessageResourceName = "Password_Required", ErrorMessageResourceType = typeof (Properties.ModelErrors))] – Feryt

+0

Tak, to prawda. DataAnnotations istnieją poza ASP.NET, więc nie wiedzą nic o App_XxxResources i po prostu działają z tradycyjnymi plikami zasobów. –

10

Miałem problemy z używaniem zlokalizowanych komunikatów o błędach i DataAnnotations, prawie identycznych z twoją sytuacją. Chociaż nie skończyłem, ponieważ puste były wyświetlane jako komunikaty o błędach, zawsze otrzymywałem pewne wyjątki. Rozwiązanie dla mnie było:

  1. w App_GlobalResources/Errors.resx otworzyć plik zasobów, należy zmienić jego właściwości zbudować Działanie: osadzonego zasobu, niestandardowe narzędzia: PublicResXFileCodeGenerator, niestandardowych przestrzeni nazw narzędzi: Zasoby (visual studio robi coś dziwnego w automatycznego generowania off nich, więc sprawdź ponownie, że wszystko jest ok)

  2. Zmienić modyfikator dostępu do pliku zasobów do publicznego

  3. sprawdź z pliku wygenerowanego kodu (Errors.Designer.cs), że przestrzeń nazw i modyfikator dostępu są poprawny.

  4. Spróbuj

Mój przykład z klasy modelu:

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

ta kwestia wygląda dość stary. Miałem podobny problem, gdy używam resx (mój magazyn komunikatów o błędach) jako typ parametru atrybutu w moim projekcie MVC3.

to rozwiązać mój problem:

  • Set "Messages.resx" - właściwość pliku "Budowanie akcji" do "zasobów Embedded"
  • Zmień parametr atrybut następująco: [Range(0, 999, ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "ERR_NUM_NOT_IN_RANGE")]

Mam nadzieję że to pomoże.

Powiązane problemy