2013-02-03 20 views
22

Perché gli attributi DataAnnotation hanno difficoltà ad accedere alle risorse create da PublicResxFileCodeGenerator?Localizzazione e datiAnnotazioni. GlobalResourceProxyGenerator e PublicResxFileCodeGenerator

trovo che il seguente attributo:

[Compare("NewPassword", ErrorMessageResourceName = "RegisterModel_ConfirmPasswordError", ErrorMessageResourceType = typeof(Resources.Global))] 

non riuscirà a trovare la risorsa se è stato creato con PublicResxFileCodeGenerator. Tuttavia una risorsa identica creata con GlobalResourceProxyGenerator funzionerà correttamente. Entrambi i file di risorse sono impostati su Contenuto e vivono in App_GlobalResources. Ho provato a mettere la lingua predefinita in App_LocalResources anche se sembra non fare alcuna differenza. Il mio test è che la mia lingua secondaria (GlobalResourceProxyGenerator) funziona ma la mia lingua principale (PublicResxFileCodeGenerator) genera un'eccezione (non riesce a trovare il file di risorse). Se passo a GlobalResourceProxyGenerator, tutto va bene (ma ovviamente non c'è accesso pubblico).

Qualcuno sa perché questo è? Mi piacerebbe spostare le risorse in un'altra assemblea in futuro.

risposta

20

Ecco perché hai inserito il tuo file di risorse nella cartella App_GlobalResources che è una cartella speciale in ASP.NET. Questo dovrebbe funzionare se metti il ​​tuo file di risorse da qualche altra parte. Questo potrebbe anche essere un progetto completamente separato dalla tua applicazione ASP.NET MVC.

Questi sono i passi che si potrebbe fare questo lavoro:

  1. Creare una nuova applicazione ASP.NET MVC 3 utilizzando il modello Internet predefinito
  2. aggiungere un file che contiene la stringa ~/Messages.resxRegisterModel_ConfirmPasswordError risorsa
  3. Impostare lo strumento personalizzato su PublicResXFileCodeGenerator per questo file di risorse:

    enter image description here

  4. Aggiungere un modello:

    public class MyViewModel 
    { 
        [Compare("NewPassword", 
          ErrorMessageResourceName = "RegisterModel_ConfirmPasswordError", 
          ErrorMessageResourceType = typeof(MvcApplication1.Messages))] 
        public string Password { get; set; } 
    
        public string NewPassword { get; set; } 
    } 
    
  5. Controller:

    public class HomeController : Controller 
    { 
        public ActionResult Index() 
        { 
         return View(new MyViewModel()); 
        } 
    
        [HttpPost] 
        public ActionResult Index(MyViewModel model) 
        { 
         return View(model); 
        } 
    } 
    
  6. Vista:

    @model MyViewModel 
    
    @using (Html.BeginForm()) 
    { 
        <div> 
         @Html.LabelFor(x => x.Password) 
         @Html.EditorFor(x => x.Password) 
         @Html.ValidationMessageFor(x => x.Password) 
        </div> 
    
        <div> 
         @Html.LabelFor(x => x.NewPassword) 
         @Html.EditorFor(x => x.NewPassword) 
         @Html.ValidationMessageFor(x => x.NewPassword) 
        </div> 
    
        <button type="submit">OK</button> 
    } 
    

Poi si potrebbe iniziare la localizzazione, fornendo rispettive traduzioni:

  • Messages.fr-FR.resx
  • Messages.de-DE.resx
  • Messages.it-IT.resx
  • Messages.es-ES.resx
  • ...

UPDATE:

mi è stato chiesto nella sezione commenti cosa c'è di così speciale la cartella App_GlobalResources e perché non funziona con esso. Beh, in realtà potresti farlo funzionare. Tutto ciò che devi fare è impostare Build Action su Embedded Resource. Per impostazione predefinita, quando si aggiunge un file nella cartella App_GlobalResources, Visual Studio impostarlo Content il che significa che questa risorsa non sarà incorporato nel gruppo runtime e ASP.NET MVC non riesce a trovarlo:

enter image description here

+0

Grazie per il risposta. Avrei potuto giurare di averlo provato, ma è possibile che io abbia avuto un problema con altri problemi (un tentativo fallito di "aggiustare" il DislayAttribute era un altro problema che ho sofferto). Soprattutto, sono più interessato al perché. Perché non riesce a localizzare questo file di risorse mentre si trova in Global_Resources? Che processo esegue VS che rende il file non riuscito nel posto giusto e perché? Lo sai? – Quibblesome

+0

@Quibblesome, ho aggiornato la mia risposta per rispondere alla domanda e come farlo funzionare anche con la cartella 'App_GlobalResources'. –

Problemi correlati