【问题标题】:asp.net mvc input / model validation multi languageasp.net mvc 输入/模型验证多语言
【发布时间】:2010-10-19 08:52:51
【问题描述】:

我对 asp.net mvc 很陌生,我知道我正在尝试找出答案 进行输入验证的好习惯。

在项目中我们将使用实体框架,您可以在其中添加 通过以下方式对属性进行数据注释:

[Required(ErrorMessage = "Please enter a product name")]
[Column]
public string Name { get; set; }

这很好,但是我们有一个多语言网站(就像大多数网站一样), 所以我们不能只用英文显示错误信息。 有什么办法可以解决这个问题?我可以根据用户的语言更改此错误消息@runtime 吗? 我应该使用 Jquery 客户端验证吗?

感谢您的意见。

更新我已经尝试过 Phil Haack 网站上的代码 这将使用静态资源解决问题,但是,我们使用来自数据库的资源而不是静态资源。

如果我为数据注释填写以下内容:

   [MetadataType(typeof(IncidentsMetaData))]
public partial class INCIDENTS
{
    private class IncidentsMetaData
    {
        [Required(ErrorMessageResourceType = typeof(CustomResourceProviders.DBResourceProviderFactory),
            ErrorMessageResourceName="1277")]
        public string SUBJECT { get; set; }
    }
}

然后我收到以下错误: 资源类型“CustomResourceProviders.DBResourceProviderFactory”没有名为“1277”的可访问静态属性。

当然没有这样的属性,它应该被一个函数访问。 知道我能做些什么吗? tnx

【问题讨论】:

    标签: asp.net-mvc validation frameworks entity


    【解决方案1】:

    您可以从RequiredAttribute 继承自定义属性,并为属性ErrorMessage 设置自己的本地化消息。它可以是这样的:

    public class LocalizedRequiredAttribute : RequiredAttribute
    {
        public LocalizedRequiredAttribute()
            : base()
        {
            // prefix for the selection of localized messages from datebase
            // e.x. for "Required" string, localized messages will be: "RuRequired", "EnRequired"
            var currentCulture = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
    
            // logic to get value from datebase
            // e.x. using Linq2Sql
            using (var context = new dateBaseContext())
            {
                var query = (from x in context.LocalizedStrings
                             where x.NameKey == currentCulture + "Required"
                             select x.NameValue).SingleOrDefault();
    
                if (query != null)
                {
                    base.ErrorMessage = query;
                }
                else
                {
                    base.ErrorMessage = "UndefinedName";
                }
            }            
    
        }
    }
    

    你也继承自 DisplayNameAttribute 并覆盖 DisplayName 属性:

    public class LocalizedDisplayNameAttribute : DisplayNameAttribute
    {
        public LocalizedDisplayNameAttribute(string displayNameKey)
            : base(displayNameKey)
        {
        }
    
        public override string DisplayName
        {
            get
            {
                if (!string.IsNullOrEmpty(base.DisplayName))
                {
                    // prefix for the selection of localized messages from datebase
                    // e.x. if DisplayName is "Country", localized messages will be: "RuCountry", "EnCountry"
                    var currentCulture = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
    
                    // logic to get value from datebase
                    // e.x. using Linq2Sql
                    using (var context = new dateBaseContext())
                    {
                        var query = (from x in context.DisplayNames
                                     where x.DisplayNameKey == currentCulture + base.DisplayName
                                     select x.DisplayNameValue).SingleOrDefault();
    
                        if (query != null)
                        {
                            return query;
                        }
    
                        return base.DisplayName;
                    }
                }
    
                return "UndefinedName";
            }
        }
    }
    

    您还可以创建继承自 ValidationAttribute 类的自定义验证属性。

    【讨论】:

    • 到目前为止,这似乎仍然是唯一可以使用数据库中的多语言字符串的方法。此外,还可以使用缓存机制来防止每次验证都查询数据库。 (我想添加此评论以防有人抱怨性能。)
    【解决方案2】:

    【讨论】:

    【解决方案3】:

    Phil Haack 写了一个 good blog post 来介绍如何做到这一点。除了您使用资源文件来提供消息之外,它基本上是相同的。

    [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = Required")]
    public string MyProperty{ get; set; }
    

    【讨论】:

    • 我已经编辑了这个问题,因为虽然答案很有帮助,但它并不能完全解决我的问题
    • 你找到解决方案了吗,我遇到了和你一样的问题
    猜你喜欢
    • 2010-09-14
    • 2015-02-26
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2017-03-27
    • 2014-06-10
    相关资源
    最近更新 更多