2010-04-22 9 views

Antwort

32

Wenn Sie die ErrorMessage-Eigenschaft verwenden, können nur konstante Zeichenfolgen oder Zeichenfolgenliterale zugewiesen werden.

Verwenden Sie stattdessen die ErrorMessageResourceType und ErrorMessageResourceName, um Ihre Ressourcen anzugeben.

[RegularExpression(
    "^[a-zA-Z0-9_]*$", 
    ErrorMessageResourceType=typeof(Resources.RegistrationModel), 
    ErrorMessageResourceName= "UsernameError" 
)] 

Beachten Sie, dass die Ressourcen öffentlichen sein muss (kann im Ressourcen-Editor eingestellt werden).

Setting resource access to public http://img402.imageshack.us/img402/504/98454371.jpg

+1

Was ist, wenn sich die Ressource in App_GlobalResources befindet? Sie können den Zugriffsmodifikator für globale Ressourcen nicht ändern. Wären Sie gezwungen, diese Ressourcen anderweitig zu verschieben, damit sie mit DataAnnotations arbeiten können? –

+0

@JohanVauhkonen können Sie die Build-Aktion zu 'Embedded Resource' und Custom Tool zu' PublicResXFileCodeGenerator' –

+0

Great, danke! –

0

Es bedeutet, dass Sie nicht den Wert des Arguments bestimmen können Sie bei runtime in das Attribut sind vorbei, es bei compile time so wird der Wert eingebettet in die Baugruppe sein muss.

Der Wert der Fehlermeldung muss ein konstanter Ausdruck sein.

Zur Information können Attributargumente nur vom Typ bool, byte, char, short, int, long, float, double, string, System.Type und enums sein.

+0

Ist das Problem in der OP nicht wirklich lösen. – AxelEckenberger

+1

Tatsächlich antwortet Davids Antwort direkt auf die gestellte Frage. –

0

Sie sollten stattdessen die Eigenschaften ErrorMessageResourceName und ErrorMessageResourceType dieses Attributs betrachten. Sie erlauben es, die Fehlermeldung von einer Ressource zu ziehen.

+0

Was wäre der ResourceType, wenn er aus dem Ordner App_GlobalResources abgerufen wird? –

+0

Resources.RegistrationModel, bei einer Schätzung? –

+0

@Jova: siehe bearbeiten in meinem Post. – AxelEckenberger

1

Versuchen FluentModelMetaDataProvider.

Verwaltet, um Ressourcen für stark typisierte Fehlermeldungen zu verwenden.

sieht wie folgt aus:

using System.Web.Mvc.Extensibility; 

namespace UI.Model 
{ 
    public class StoreInputMetadata : ModelMetadataConfigurationBase<StoreInput> 
    { 
     public StoreInputMetadata() 
     { 
      Configure(m => m.Id) 
       .Hide(); 
      Configure(model => model.Name) 
       .Required(Resources.Whatever.StoreIsRequired) 
       .MaximumLength(64, Resources.Whatever.StoreNameLengthSomething); 
     } 
    } 
} 

Was ist die Botschaft, mir zu sagen, Fehler?

Ein Attributargument muss ein Konstantenausdruck, ein Ausdruckstyp oder ein Arrayerstellungsausdruck eines Attributparametertyps sein.

Es ist bereits selbsterklärend. C# ist keine dynamische Sprache wie Ruby, in die Sie Klassen schreiben können, die zur Laufzeit zufällige Basisklassen erben. :)

Here's was Skeet dazu sagt.

1

Sehen Sie bitte diesen Link: http://code.msdn.microsoft.com/Getting-Started-WCF-RIA-1469cbe2/sourcecode?fileId=19242&pathId=774666288 (Link gebrochen, aber für die Zuordnung Zwecke links)

public sealed partial class RegistrationData 
{ 
    [Key] 
    [Required(ErrorMessageResourceName = "ValidationErrorRequiredField", ErrorMessageResourceType = typeof(ErrorResources))] 
    [Display(Order = 0, Name = "UserNameLabel", ResourceType = typeof(RegistrationDataResources))] 
    [RegularExpression("^[a-zA-Z0-9_]*$", ErrorMessageResourceName = "ValidationErrorInvalidUserName", ErrorMessageResourceType = typeof(ErrorResources))] 
    [StringLength(255, MinimumLength = 4, ErrorMessageResourceName = "ValidationErrorBadUserNameLength", ErrorMessageResourceType = typeof(ErrorResources))] 
    public string UserName { get; set; } 
+0

+1 zum Anzeigen einer vollständigen Liste der Attribute, die dieses Muster verwenden. Insbesondere ist es leicht zu übersehen, dass Display sich von den anderen unterscheidet. "Name" ist der Name in der Ressourcendatei ... – Elton

Verwandte Themen