24

DataAnnotation 属性が PublicResxFileCodeGenerator によって作成されたリソースにアクセスするのが難しいのはなぜですか?

次の属性があることがわかりました。

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

リソースが PublicResxFileCodeGenerator で作成されている場合、リソースを見つけることができません。ただし、GlobalResourceProxyGenerator で作成された同一のリソースは正しく機能します。どちらのリソース ファイルも Content に設定され、App_GlobalResources に存在します。App_LocalResources にもデフォルト言語を入れてみましたが、違いはないようです。私のテストでは、セカンダリ言語 (GlobalResourceProxyGenerator) は機能しますが、プライマリ言語 (PublicResxFileCodeGenerator) は例外をスローします (リソース ファイルが見つかりません)。両方を GlobalResourceProxyGenerator に切り替えると、すべて問題ありません (ただし、明らかにパブリック アクセスはありません)。

これがなぜなのか誰か知っていますか?将来、リソースを別のアセンブリに移動したいと考えています。

4

1 に答える 1

22

App_GlobalResourcesこれは、ASP.NET の特別なフォルダーであるフォルダー内にリソース ファイルを配置したためです。リソースファイルを別の場所に置いた場合、これは機能するはずです。これは、ASP.NET MVC アプリケーションとは完全に別のプロジェクトである可能性もあります。

これを機能させる手順は次のとおりです。

  1. デフォルトのインターネット テンプレートを使用して新しい ASP.NET MVC 3 アプリケーションを作成する
  2. リソース文字列~/Messages.resxを含むファイルを追加しますRegisterModel_ConfirmPasswordError
  3. PublicResXFileCodeGeneratorこのリソース ファイルのカスタム ツールを次のように設定します。

    ここに画像の説明を入力

  4. モデルを追加します。

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

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

    @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>
    }
    

次に、それぞれの翻訳を提供してローカライズを開始できます。

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

アップデート:

コメント セクションで、このフォルダの何が特別なのApp_GlobalResourcesか、なぜこのフォルダでは機能しないのかと尋ねられました。まあ、実際にそれを機能させることができます。を に設定するだけBuild ActionですEmbedded Resource。既定では、App_GlobalResourcesフォルダーにファイルを追加すると、Visual Studio はContent、このリソースがランタイム アセンブリに組み込まれず、ASP.NET MVC がそれを見つけられないことを意味するように設定します。

ここに画像の説明を入力

于 2013-02-07T21:55:50.813 に答える