14

Uso un provider di risorse personalizzate per ottenere stringhe di risorse da un database. Funziona perfettamente con ASP.NET dove posso definire il tipo di risorsa come una stringa. Gli attributi dei metadati per le proprietà del modello in MVC 3 (come [Intervallo], [Visualizzazione], [Richiesto] richiedono il tipo di una risorsa come parametro, dove ResourceType è il tipo della classe code-behind generata di un file .resx .Localizzazione ASP.NET MVC 3 con DisplayAttribute e provider di risorse personalizzate

[Display(Name = "Phone", ResourceType = typeof(MyResources))] 
    public string Phone { get; set; } 

Perché io non ho i file resx, tale classe non esiste. Come posso utilizzare il modello attribuisce con un provider di risorse personalizzato?

Vorrei avere qualcosa di simile :

[Display(Name = "Telefon", ResourceTypeName = "MyResources")] 
    public string Phone { get; set; } 

The DisplayNameAttribute da System.ComponentModel aveva una proprietà DisplayName sovrascrivibile per questo scopo, ma la classe DisplayAttribute è sigillata. Per gli attributi di validazione non esistono classi corrispondenti.

risposta

4

è possibile estendere la DisplayNameAttribute e sovrascrivere la proprietà della stringa DisplayName. Ho qualcosa di simile

public class LocalizedDisplayName : DisplayNameAttribute 
    { 
     private string DisplayNameKey { get; set; } 
     private string ResourceSetName { get; set; } 

     public LocalizedDisplayName(string displayNameKey) 
      : base(displayNameKey) 
     { 
      this.DisplayNameKey = displayNameKey; 
     } 


     public LocalizedDisplayName(string displayNameKey, string resourceSetName) 
      : base(displayNameKey) 
     { 
      this.DisplayNameKey = displayNameKey; 
      this.ResourceSetName = resourceSetName; 
     } 

     public override string DisplayName 
     { 
      get 
      { 
       if (string.IsNullOrEmpty(this.GlobalResourceSetName)) 
       { 
        return MyHelper.GetLocalLocalizedString(this.DisplayNameKey); 
       } 
       else 
       { 
        return MyHelper.GetGlobalLocalizedString(this.DisplayNameKey, this.ResourceSetName); 
       } 
      } 
     } 
    } 
} 

Per MyHelper, i metodi possono essere qualcosa di simile:

public string GetLocalLocalizedString(string key){ 
    return _resourceSet.GetString(key); 
} 

Ovviamente è necessario aggiungere la gestione degli errori e hanno il resourceReader istituito. Maggiori informazioni here

Con questo, è quindi decorare il vostro modello con il nuovo attributo, passando la chiave della risorsa che si desidera ottenere il valore da, come questo

[LocalizedDisplayName("Title")] 

Allora visualizzerà l'localizzata the Html.LabelFor testo automaticamente.

+1

i pensa di aver dimenticato di inserire il codice per "MyHelper.GetLocalLocalizedString" –

+0

So che questo sta per diventare uno zombi ma per questo ti meriti più internet. – Machinarius

+1

E qual è il codice in "MyHelper.GetLocalLocalizedString" ??? – Bellash

2

Penso che si debba sovrascrivere le proprietà DataAnnotations per localizzarle con un provider di risorse DB. È possibile ereditare da quelli correnti e quindi specificare ulteriori proprietà come la stringa di connessione DB da utilizzare quando si ricevono le risorse dal proprio provider personalizzato.

+0

Sfortunatamente questo non funziona in quanto DisplayAttribute è una classe sigillata. Anche se eseguo la mia implementazione per l'attributo, dovrei sovrascrivere anche i metodi di estensione Html (ad esempio Html.LabelFor). – slfan

+0

Ho fatto ulteriori indagini: potrei derivare da DisplayNameAttribute che ha una proprietà overrideble DisplayName. Alla fine ho usato un modello T4 per generare la classe Resources perché non devo implementare tutti gli attributi di annotazione dei dati. – slfan

7

Il modo più pulito che ho trovato è quello di ignorare DataAnnotationsModelMetadataProvider. Ecco un articolo molto accurato su come farlo.

http://buildstarted.com/2010/09/14/creating-your-own-modelmetadataprovider-to-handle-custom-attributes/

+0

vorresti mostrarci come sei riuscito a scriverlo. L'articolo mostra come aggiungere una nuova notazione di dati, ma non mostra nulla sulla localizzazione –

+0

Vedere http://www.codeproject.com/Tips/514321/A-Simple-and-Efficective-Way-to-L –

Problemi correlati