Сообщения проверки аннотации данных не локализуются при изменении UICulture в ActionFilter - PullRequest
2 голосов
/ 22 февраля 2010

Причина кажется достаточно простой: привязка модели (и, следовательно, проверка) происходит до того, как будет выполнен самый ранний метод ActionFilter (OnActionExecuting), поэтому изменение UICulture не влияет на сообщения проверки.

Есть ли более ранняя точка интеграции (кроме IHttpModule), которую я мог бы использовать здесь?

Я бы предпочел подход, основанный на атрибутах, поскольку функциональность не распространяется на все контроллеры / действия, поэтому IHttpModules не очень хорошая идея (списки исключающих фильтров и т. П.)

Ответы [ 2 ]

1 голос
/ 23 февраля 2010

Ну, самое простое «основанное на атрибутах» решение, о котором я могу подумать, это своего рода хак…

Фильтры авторизации запускаются до того, как механизм связывания модели заработает. Так что, если вы напишите фальшивое AuthorizeAttribute, вы можете установить там культуру.

public class SetCultureAttribute : AuthorizeAttribute {
    protected override bool AuthorizeCore(HttpContextBase httpContext) {
        //set the culture here
        return true; //so the action will get invoked
    }
}
//and your action
[SetCulture]
public ActionResult Foo(SomeModel m) {
    return View();
}
0 голосов
/ 26 февраля 2010

Просто подумал о другом решении этой проблемы.
Я считаю, что это намного элегантнее, чем другое решение , и оно основано на атрибутах (хотя это зависит от того, как вы хотите прикрепить это связующее к вашей модели).

Вы можете создать собственное связующее для модели и извлечь его из DataAnnotationsModelBinder. Затем установите культуру перед тем, как сказать базовому классу связать модель.

public class CustomModelBinder : DataAnnotationsModelBinder {
    public override object BindModel(ControllerContext controllerContext,
        ModelBindingContext bindingContext) {

        //set the culture
        return base.BindModel(controllerContext, bindingContext);
    }
}
//and the action
public ActionResult Foo([ModelBinder(typeof(CustomModelBinder))]SomeModel m) {
    return View();
}

//Or if you don't want that attribute on your model in your actions
//you can attach this binder to your model on Global.asax
protected void Application_Start() {
    ModelBinders.Binders.Add(typeof(SomeModel), new CustomModelBinder());
    RegisterRoutes(RouteTable.Routes);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...