我已经制作了自己的翻译系统,我需要翻译验证属性产生的所有验证错误,我已经使用这样的DisplayNames这样做了:
public class MyCustomDataAnnotationModelProvider : DataAnnotationsModelMetadataProvider
{
protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
{
var data = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
if (data.DisplayName != null)
data.DisplayName = Translator.TranslateOnce(data.DisplayName);
return data;
}
}
这会翻译所有的Display属性::
[Required(ErrorMessage="message"), Display(Name="Language"), StringLength(10)]
public string LanguageName { get; set; }
所以基本上我想用验证错误做同样的事情,但我无法弄清楚如何迭代它们。 有一个叫做data.GetValidators()的东西,但它需要我无法找到的ControllerContext。
答案 0 :(得分:1)
您可以通过创建从ActionFilterAttribute派生的属性并在OnResultExecuting
方法中修改ModelState集合来实现此目的。然后使用System.Web.Mvc.GlobalFilters
集合全局应用此属性。
修改ModelState:
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
foreach (var s in filterContext.Controller.ViewData.ModelState.Values)
{
for (var i = s.Errors.Count - 1; i >= 0; i--)
{
var e = s.Errors[i];
if (e.Exception != null && !string.IsNullOrWhiteSpace(e.ErrorMessage))
s.Errors.Add(new ModelError(Translate(e.Exception), Translate(e.ErrorMessage)));
else if (e.Exception != null)
s.Errors.Add(new ModelError(Translate(e.Exception)));
else
s.Errors.Add(new ModelError(Translate(e.ErrorMessage)));
s.Errors.RemoveAt(i);
}
}
}