Bu eski bir soru, ancak bunun çok yaygın bir sorun olduğunu düşünüyorum ve işte MVC 3'teki çözümüm.
İlk olarak, kötü dizelerden kaçınmak için sabitler oluşturmak için bir T4 şablonuna ihtiyaç vardır. Tüm etiket dizelerini tutan 'Labels.resx' kaynak dosyamız var. Bu nedenle T4 şablonu kaynak dosyasını doğrudan kullanır,
<#@ template debug="True" hostspecific="True" language="C#" #>
<#@ output extension=".cs" #>
<#@ Assembly Name="C:\Project\trunk\Resources\bin\Development\Resources.dll" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Globalization" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Resources" #>
<#
var resourceStrings = new List<string>();
var manager = Resources.Labels.ResourceManager;
IDictionaryEnumerator enumerator = manager.GetResourceSet(CultureInfo.CurrentCulture, true, true)
.GetEnumerator();
while (enumerator.MoveNext())
{
resourceStrings.Add(enumerator.Key.ToString());
}
#>
// This file is generated automatically. Do NOT modify any content inside.
namespace Lib.Const{
public static class LabelNames{
<#
foreach (String label in resourceStrings){
#>
public const string <#=label#> = "<#=label#>";
<#
}
#>
}
}
Ardından, 'DisplayName'i yerelleştirmek için bir uzantı yöntemi oluşturulur,
using System.ComponentModel.DataAnnotations;
using Resources;
namespace Web.Extensions.ValidationAttributes
{
public static class ValidationAttributeHelper
{
public static ValidationContext LocalizeDisplayName(this ValidationContext context)
{
context.DisplayName = Labels.ResourceManager.GetString(context.DisplayName) ?? context.DisplayName;
return context;
}
}
}
"Labels.resx" ten otomatik olarak okunabilmesi için "DisplayName" özniteliğinin yerini "DisplayLabel" özniteliği almıştır,
namespace Web.Extensions.ValidationAttributes
{
public class DisplayLabelAttribute :System.ComponentModel.DisplayNameAttribute
{
private readonly string _propertyLabel;
public DisplayLabelAttribute(string propertyLabel)
{
_propertyLabel = propertyLabel;
}
public override string DisplayName
{
get
{
return _propertyLabel;
}
}
}
}
Tüm bu hazırlık çalışmalarından sonra, bu varsayılan doğrulama özelliklerine dokunma zamanı. Örnek olarak "Gerekli" özelliğini kullanıyorum,
using System.ComponentModel.DataAnnotations;
using Resources;
namespace Web.Extensions.ValidationAttributes
{
public class RequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute
{
public RequiredAttribute()
{
ErrorMessageResourceType = typeof (Errors);
ErrorMessageResourceName = "Required";
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
return base.IsValid(value, validationContext.LocalizeDisplayName());
}
}
}
Şimdi bu özellikleri modelimize uygulayabiliriz,
using Web.Extensions.ValidationAttributes;
namespace Web.Areas.Foo.Models
{
public class Person
{
[DisplayLabel(Lib.Const.LabelNames.HowOldAreYou)]
public int Age { get; set; }
[Required]
public string Name { get; set; }
}
}
Varsayılan olarak, özellik adı 'Label.resx'i aramak için anahtar olarak kullanılır, ancak bunu' DisplayLabel 'üzerinden ayarlarsanız, bunun yerine onu kullanır.