DarioSantarelli.Blog("UgiDotNet");

<sharing mode=”On” users=”*” />
posts - 176, comments - 144, trackbacks - 3

My Links

News


This is my personal blog. These postings are provided "AS IS" with no warranties, and confer no rights.




Tag Cloud

Archives

Post Categories

My English Blog

giovedì 29 aprile 2010

[ASP.NET MVC 2] Localizzazione dell’attributo DisplayName

Per localizzare i metadati delle classi che compongono il model della nostra applicazione MVC 2, principalmente sono due gli aspetti da prendere in considerazione:

  • Localizzare i messaggi di validazione del model. In generale, la localizzazione dei messaggi di errore non è specifica di ASP.NET MVC, bensì è una caratteristica ereditata dai “Data Annotations” di ASP.NET Dynamic Data (namespace System.ComponentModel.DataAnnotations), e si implementa specificando i parametri ErrorMessageResourceName e ErrorMessageResourceType dei vari ValidationAttribute.
  • Localizzare la proprietà DisplayName ove disponibile.

Supponiamo di avere il seguente model:

public class CreateCustomerModel
{
 
[Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(ValidationStrings))]
 
[DisplayName("Name")]
 
public string Name { get; set; }  

  [Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(ValidationStrings))] 
  [DataType(DataType.EmailAddress)] 
  [DisplayName("Email address")]
 
public string Email { get; set; } 

  [DataType(DataType.Url)]
 
[DisplayName("Web site")]
 
public string WebSiteUrl { get; set; }       
}


La proprietà DisplayName può essere coinvolta sia nella validazione dei messaggi che utilizzano dei parametri per la formattazione, ma anche e soprattutto nel rendering della view: 

<div class="editor-label">
 
<%: Html.LabelFor(model => model.Name) %>
</div>
<div class="editor-field">
 
<%: Html.TextBoxFor(model => model.Name) %>
 
<%: Html.ValidationMessageFor(model => model.Name) %>
</div>
<div class="editor-label">
  
<%: Html.LabelFor(model => model.Email) %>
</div>
<div class="editor-field">
 
<%: Html.TextBoxFor(model => model.Email) %>
 
<%: Html.ValidationMessageFor(model => model.Email) %>
</div>
<div class="editor-label">
 
<%: Html.LabelFor(model => model.WebSiteUrl) %>
</div>
<div class="editor-field">
 
<%: Html.TextBoxFor(model => model.WebSiteUrl) %>
 
<%: Html.ValidationMessageFor(model => model.WebSiteUrl) %>
</div>

Ci troviamo in questa brutta situazione:

immagine1xf[2]


Purtroppo, a differenza dei ValidationAttribute, la proprietà DisplayName non supporta nativamente la localizzazione e quindi non abbiamo gratis la possibilità di specificare una chiave di un file di risorsa (es. ModelStrings.it.resx) dal quale leggere la stringa localizzata.
Possiamo però estendere l’attributo DisplayName in modo da abilitare tale funzionalità tramite reflection. 

 
public class LocalizedDisplayNameAttribute : System.ComponentModel.DisplayNameAttribute
{
 
private PropertyInfo _namePropertyInfo = null;
 
private Type _resourceType = null;

 
public LocalizedDisplayNameAttribute(string displayNameKey) : base(displayNameKey) { }

 
public Type ResourceType
 
{
   
get { return _resourceType; }
   
set
   
{
     
_resourceType = value; 
     
_namePropertyInfo = _resourceType.GetProperty(base.DisplayName, BindingFlags.Static | BindingFlags.Public);
   
}
 
}

 
public override string DisplayName
 
{
   
get
   
{                
     
if (_namePropertyInfo == null) return base.DisplayName;               
     
return (string)_namePropertyInfo.GetValue(_namePropertyInfo.DeclaringType, null);
   
}
 
}
}

La classe CreateCustomerModel prima descritta diventa quindi…

public
class CreateCustomerModel
{
 
[Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(ValidationStrings))]
 
[LocalizedDisplayName("Name", ResourceType = typeof(ModelStrings))]       
  
public string Name { get; set; }

 
[Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(ValidationStrings))]
 
[DataType(DataType.EmailAddress)]
 
[LocalizedDisplayName("Email", ResourceType = typeof(ModelStrings))]  
  
public string Email { get; set; }

 
[DataType(DataType.Url)]
 
[LocalizedDisplayName("WebSite", ResourceType = typeof(ModelStrings))]  
  
public string WebSiteUrl { get; set; }       
}

…il che ci fa ottenere il risultato desiderato :D

immagine3qg[1] 

Technorati Tag: ,,

posted @ giovedì 29 aprile 2010 20.20 | Feedback (0) |

Powered by: