动态编辑所有属性错误消息

时间:2012-11-05 10:38:54

标签: c# asp.net-mvc attributes asp.net-mvc-4 metadata

我已经制作了自己的翻译系统,我需要翻译验证属性产生的所有验证错误,我已经使用这样的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。

1 个答案:

答案 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);
        }
    }
}