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;
    }
}

そして、それはすべての表示属性を変換します::

[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次に、コレクションを使用してこの属性をグローバルに適用します。

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