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