2011-12-19 7 views
8

データベースに文字列をローカライズしました。extending the ASP.NET Resource Provider ModelがASP.NET MVC 3 Razorビューエンジンで動作するかどうかを知りたいと思います。ASP.NET MVC 3:ローカリゼーションストアとしてリソースファイルの代わりにデータベースを使用

ASP.NET MVC 3 Razorビューエンジンが、ASP.NETリソースプロバイダモデルを拡張した後、ローカライズされた文字列をデータベースから取得できるかどうかを教えてください。それとも、クラシックASP.NETでのみ動作し、ASP.NET MVCでは動作しません。

はあなたに、リックはすでにあなたのためにそれを行っているので、あなたは幸運である

Satyaprakash J

+0

[ASP.NET MVC 2 Localization/Globalizatio nデータベースに格納されていますか?](http://stackoverflow.com/questions/2568129/asp-net-mvc-2-localization-globalization-stored-in-the-database) – jrummell

答えて

9

私がこれまでに発見したクリーンなソリューションです:http://www.codeproject.com/Tips/514321/A-Simple-and-Effective-Way-to-Localize-ASP-Net-MVC

コメント/フィードバックは歓迎します。

編集1:コメントに基づいて、コード例を追加し、リンクを参考にしました。

私はcustomDataAnnotationsProviderクラスを作成しました:

public class CustomDataAnnotationsProvider: DataAnnotationsModelMetadataProvider 
{ 
    private ResourceManager resourceManager = new ResourceManager(); 
    protected override ModelMetadata CreateMetadata(
         IEnumerable<Attribute> attributes, 
         Type containerType, 
         Func<object> modelAccessor, 
         Type modelType, 
         string propertyName) 
    { 
     string key = string.Empty; 
     string localizedValue = string.Empty; 


     foreach (var attr in attributes) 
     { 
      if (attr != null) 
      { 
       if (attr is DisplayAttribute) 
       { 
        key = ((DisplayAttribute)attr).Name; 
        if (!string.IsNullOrEmpty(key)) 
        { 
         localizedValue = resourceManager.GetLocalizedText(key); 
         ((DisplayAttribute)attr).Name = localizedValue; 
        } 
       } 
       else if (attr is ValidationAttribute) 
       { 
        key = ((ValidationAttribute)attr).ErrorMessage; 
        if (!string.IsNullOrEmpty(key)) 
        { 
         localizedValue = resourceManager.GetLocalizedText(key); 
         ((ValidationAttribute)attr).ErrorMessage = localizedValue; 
        } 
       } 
      } 
     } 
     return base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName); 
    } 
} 

は、その後、私はGlobal.asaxの

ModelMetadataProviders.Current = new Project.Web.Helpers.CustomDataAnnotationsProvider(); 

をApplicationStart上のカスタムプロバイダを参照あなたのモデルを変更する必要はありませんと表示アノテーションを使用することができます:

[Display(Name = "CustomerAccountNumber")] 
public string CustomerAccountNumber { get; set; } 
+0

リンクのみの回答はお勧めできませんが、参照は時間の経過とともに古くなる傾向があります。ここにスタンドアロンの概要を追加し、リンクを参照として保持することを検討してください。 – kleopatra

関連する問題