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

7

在我的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 ); }
    }
}

有什么建议吗?

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

Resw生成器

1个回答

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");
            }
        }#>

    } 
}

如果您将模板放在与资源文件相同的文件夹中,它将输出一个名为 ResourceHelper.cs 的文件。然后可以在您的对象模型中使用它:
 [Required(ErrorMessageResourceName = "validation_string", ErrorMessageResourceType = typeof(ResourceHelper))]

注意,有一些限制。首先,我不太擅长T4模板,因此代码可能可以得到极大的改进。现在,您必须确保您给资源的名称将导致有效的方法名称-不要在其中放置空格!
其次,当您在资源文件中添加新的键/值时,该模板不会自动生成,您必须进入模板并保存。
除此之外,它应该可以正常工作-希望它有所帮助!

这是解决问题的好方法。非常感谢。我没有想到过。还有一些小问题,但我可以自己解决。现在会更深入地研究T4语法。 - Michael A. Volz aka Flynn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接