如何在Windows Store(Metro)应用程序的DataAnnotations中使用"ErrorMessageResourceType"

Fly*_*ynn 7 .net c# microsoft-metro windows-runtime windows-store-apps

在我的Windows Store(Metro)应用程序中,我正在为我的对象使用DataAnnotations.一切正常.

现在我尝试将我的字符串放入Resource.resw文件中.DataAnnotations需要填充2个属性:ErrorMessageResourceNameErrorMessageResourceType.如何使用ErrorMessageResourceType新资源类型?

public class Person : Entity
{
    private string _firstName;

    [Required( ErrorMessageResourceName = "GenericFieldRequired", ErrorMessageResourceType = typeof( ??? ))]
    public string FirstName {
        get { return _firstName; }
        set { SetPropertyChanged( ref _firstName, value, this ); }
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么建议?

更新: 我找到了一个自动生成Resources.cs文件的Visual Studio工具:

Resw Generator

Ros*_*gan 8

经过大量挖掘后,我想我明白为什么你会遇到问题.

在其他项目类型中,资源文件自动转换为具有静态方法的类,称为资源键的名称.

没有办法真正自动执行此操作,因此我编写了一个T4模板,可以帮助您解决这个问题.

<#@ template debug="false" hostspecific="True" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Xml" #>
<#@ assembly name="System.Xml" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>
using Windows.ApplicationModel.Resources;
<# 
  var namespaceName = System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("NamespaceHint");
#> 
namespace <#= namespaceName #>
{ 
    public class ResourceHelper
    {
        private static readonly ResourceLoader resourceLoader = new ResourceLoader("Resources");
<# using (XmlReader reader = XmlReader.Create(Host.ResolvePath("Resources.resw")))
        {
             bool found=reader.ReadToFollowing("data");
             while(found)
             {
                reader.MoveToFirstAttribute();
                string name = reader.Value;     

#>
            public static string <#= name #>
            {
                get
                {
                    return resourceLoader.GetString("<#= name #>");
                }
            }
<#
                found=reader.ReadToFollowing("data");
            }
        }#>

    } 
}
Run Code Online (Sandbox Code Playgroud)

如果将模板放在与资源文件相同的文件夹中,它将输出一个名为ResourceHelper.cs的文件.然后可以在您的对象模型中使用它: -

 [Required(ErrorMessageResourceName = "validation_string", ErrorMessageResourceType = typeof(ResourceHelper))]
Run Code Online (Sandbox Code Playgroud)

请注意,有一些限制.首先,我不太擅长T4模板,所以代码可能会大大改进.现在你必须确保你给资源的名称产生一个有效的方法名称 - 不要在那里放置空格!

其次,当您在资源文件中添加新的键/值时,模板不会自动生成,您必须进入模板并点击保存.

除此之外它应该工作正常 - 希望它有所帮助!