2009-09-26 19 views
7

Ich habe Validation wie:ASP.NET MVC: Validation und lokalisierte Errormessage

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

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

..und es wie folgt aus:

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 bei App_GlobalResources Ressource-Datei ist und "txtUsername" - ist der String-Name in der Ressourcendatei.

Problem: Fehlermeldungen werden nicht angezeigt.

Frage: Wie Fehlermeldung einstellen, wenn ich einige Sprachen auf der Website habe.

Eine weitere Infos:

Ich bin in der Lage Zugang SignIn.txtUsername von Ansichten oder eine Datei in das Projekt. Vom Controller

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

funktioniert gut, gut .. Ich kann Errormessage innen Validation zuweisen, bekam aber Fehler nach der zweiten Validierung versuchen ... wenn ich diese überprüfen wie platzieren -

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

-I-Fehler haben nach Ich wechsle in eine andere Sprache - ErrorMessage kann nur einmal vergeben werden.

Bitte beraten wie ich es lösen kann.

Vielen Dank im Voraus.

Antwort

1

Stellen Sie im Ressourceneditor sicher, dass Ihre Ressourcensichtbarkeit auf "Öffentlich" und nicht "Intern" eingestellt ist. Andernfalls funktioniert die Reflektion von DataAnnotations nicht.

+0

Wie ich schrieb, verwende ich globale Ressourcen "SignIn ist Ressource-Datei bei App_GlobalResources" –

+0

Leider können Sie Ressourcen in App_GlobalResources nicht öffentlich machen. Sie müssen stattdessen die Ressourcendatei aus dem Ordner "Eigenschaften" verwenden - klicken Sie mit der rechten Maustaste auf das Projekt, wählen Sie die Eigenschaften aus, wählen Sie im linken Menü "Ressourcen" und klicken Sie auf "dieses Projekt ...". Die Standardressourcendatei mit dem Namen "Resources.resx" wird erstellt. Sie können es umbenennen (zB "ModelErrors") und im Code verwenden: [Erforderlich (ErrorMessageResourceName = "Password_Required", ErrorMessageResourceType = typeof (Properties.ModelErrors))] – Feryt

+0

Ja, das stimmt. DataAnnotations existieren außerhalb von ASP.NET, sodass sie nichts über App_XxxResources wissen und nur mit herkömmlichen Ressourcendateien arbeiten. –

10

Ich hatte einige Probleme mit lokalisierten Fehlermeldungen und DataAnnotations, fast identisch mit Ihrer Situation. Obwohl ich nicht mit Leerzeichen als Fehlermeldung angezeigt wurde, habe ich immer einige Ausnahmen geworfen. Lösung für mich war:

  1. in App_GlobalResources/Errors.resx die Ressource-Datei öffnen, ändern Sie Eigenschaften der Aktion Build: Eingebettete Ressource, Custom Tool: PublicResXFileCodeGenerator, Custom Tool listet alle Ressourcen (Visual Studio tut etwas seltsam in autogenerating diese, so überprüfen sie wieder, dass die Dinge in Ordnung sind

    )
  2. ändern der Zugriffsmodifikator der Ressourcendatei zu öffentlichen

  3. überprüfen von der Code-Datei erzeugt (Errors.Designer.cs), dass der Namespace und Zugriffsmodifikator sind richtig.

  4. Probieren Sie es

Mein Beispiel aus der Modellklasse:

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

Diese Frage ziemlich alt aussieht. Ich hatte ein ähnliches Problem bei der Verwendung von Resx (mein Fehlerspeicher) als Attribut Parametertyp in meinem MVC3-Projekt.

Dies löste mein Problem:

  • Set "Messages.resx" - Dateieigenschaft "Build-Aktion" auf "Embedded Resource"
  • ändern Attribut Parameter wie folgt: [Range(0, 999, ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "ERR_NUM_NOT_IN_RANGE")]

Hoffe das hilft.

Verwandte Themen