Asp.net mvc 4 ASP.NET MVC4模型绑定

Asp.net mvc 4 ASP.NET MVC4模型绑定,asp.net-mvc-4,action-filter,Asp.net Mvc 4,Action Filter,有人知道模型绑定在请求生命周期中何时发生吗?我问的原因是我遇到了一些本地化问题 模型绑定是否在OnActionExecuting执行之前发生 目前,我在ActionExecuting方法的全局操作筛选器中设置了当前区域性,但在执行模型绑定时不遵守这一点。请求是一个帖子 提前感谢。首先点击BindModel。您的本地化是否可以根据请求进行更改?如果是这样,您可以覆盖默认的模型绑定器,如果需要,在那里设置您的区域设置。按照下面的链接创建自定义模型活页夹 (为了证明自己,只需在其中设置两个断点,您就

有人知道模型绑定在请求生命周期中何时发生吗?我问的原因是我遇到了一些本地化问题

模型绑定是否在OnActionExecuting执行之前发生

目前,我在ActionExecuting方法的全局操作筛选器中设置了当前区域性,但在执行模型绑定时不遵守这一点。请求是一个帖子


提前感谢。

首先点击BindModel。您的本地化是否可以根据请求进行更改?如果是这样,您可以覆盖默认的模型绑定器,如果需要,在那里设置您的区域设置。按照下面的链接创建自定义模型活页夹

(为了证明自己,只需在其中设置两个断点,您就会看到顺序)


我认为可能有一个更好的地方来设置本地化,但需要更具体的信息,这可能是另一个问题。

我建议您将文化设置在一个非常早的时间点,而不是在行动中。在我当前的项目中,我在Global.asax.cs中的
应用程序\u AcquisiteRequestState
事件中设置了区域性。你可以试试

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之前运行

我不喜欢提议的解决方案,因为弄乱路由不是我的首选解决方案。侦听应用程序状态是有问题的,因为此事件针对每个请求触发,而不仅仅针对将路由到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);
    }

  }
}

我有完全相同的设置和问题,谢谢你的提问;)我想这确实是一个更好的解决方案。这个解决方案对我来说很有效,但现在它意味着这个代码针对每个请求运行,而不仅仅是针对控制器的操作。请求的任何图像或JS文件现在都在运行此代码,这可能会影响性能。