我对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
答案 0 :(得分:8)
您可以从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类的自定义验证属性。
答案 1 :(得分:3)
答案 2 :(得分:2)
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = Required")]
public string MyProperty{ get; set; }