ASP.NET привязка модели MVC4


Кто-нибудь знает, когда привязка модели происходит в жизненном цикле запроса? Причина, по которой я спрашиваю, заключается в том, что я сталкиваюсь с некоторыми проблемами локализации.

Происходит ли привязка модели до выполнения OnActionExecuting?

В настоящее время я устанавливаю текущую культуру в методе глобальных фильтров действий OnActionExecuting, но это не соблюдается при выполнении привязки модели. Запрос - это пост.

Заранее благодарю.

4 7

4 ответа:

BindModel поражается первым . Может ли ваша локализация измениться по запросу? Если это так, вы можете переопределить привязку модели по умолчанию и при необходимости установить там свой языковой стандарт. Перейдите по ссылке ниже на создание пользовательской модели binder

ASP.NET связыватель модели MVC для универсального типа

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

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

Я бы предложил вам установить культуру на очень ранней стадии не в фильтре действия. В моем текущем проекте я установил культуру в событии Application_AcquireRequestState в Global.асакс.CS. Вы можете попробовать это.

protected void Application_AcquireRequestState(Object sender, EventArgs e)
{
   // set the culture
}

Я обнаружил, что в приложении MVC лучшим способом является использование пользовательского routehandler и установка культуры в этом обработчике. Это работает безупречно с ModelBinders и локализованными ресурсами в аннотациях данных.

public class MultiCultureMvcRouteHandler : MvcRouteHandler
{
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        // get culture from route data
        var culture = requestContext.RouteData.Values["culture"].ToString();
        var ci = new CultureInfo(culture);
        Thread.CurrentThread.CurrentUICulture = ci;
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);
        return base.GetHttpHandler(requestContext);
    }
}

Есть отличная статья в блоге Алекса Адамяна , описывающая эту технику.

Смотрите такжеэтот вопрос и ответы на SO.

Я также сталкиваюсь с той же проблемой. Если связыватель модели содержит недопустимые данные, он запускается перед ActionFilter(Ами).

Мне не понравились предложенные решения, потому что возня с маршрутизацией не была моим предпочтительным решением. Прослушивание Application_AcquireRequestState проблематично, поскольку это событие срабатывает для каждого запроса, а не только для запросов, которые будут перенаправлены в контроллеры MVC.

В итоге я написал пользовательскую реализацию IControllerFactory, которая использует DefaultControllerFactory внутренне и выполните код локализации внутри метода CreateController.
Это тоже не идеально, надеюсь, это поможет.

  public class PluggableControllerFactory : IControllerFactory {

    private readonly IControllerFactory innerControllerFactory;

    public PluggableControllerFactory() {
      innerControllerFactory = new DefaultControllerFactory();
    }

    public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) {
      // Run your culture localization here

      return innerControllerFactory.CreateController(requestContext, controllerName);
    }

    public System.Web.SessionState.SessionStateBehavior GetControllerSessionBehavior(System.Web.Routing.RequestContext requestContext, string controllerName) {
      return innerControllerFactory.GetControllerSessionBehavior(requestContext, controllerName);
    }

    public void ReleaseController(IController controller) {
      innerControllerFactory.ReleaseController(controller);
    }

  }
}