1

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

4

1 回答 1

1

您可以通过创建派生自 ActionFilterAttribute 的属性并修改OnResultExecuting方法中的 ModelState 集合来实现此目的。然后使用System.Web.Mvc.GlobalFilters集合全局应用此属性。

修改模型状态:

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);
        }
    }
}
于 2012-11-05T11:42:21.757 回答