【问题标题】:MVC3 Route/redirect problemMVC3 路由/重定向问题
【发布时间】:2011-07-02 13:49:05
【问题描述】:

我的应用程序是多语言的,我编写了以下路线来处理语言:

routes.MapRoute(
            "Default", // Route name
            "{language}/{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", 
               language = "pt", id = UrlParameter.Optional }, // Parameter defaults
            new { language = @"(pt)|(es)|(en)" }
        );

这适用于domain.comdomain.com/pt/home/index。但是,如果我输入 domain.com/home/index,它会失败 (404)

所需的行为是将其重定向到domain.com/pt/home/index(pt 是默认语言)。

实现这一目标的最佳方法是什么?我已经阅读了很多关于路由和 ActionFilters 的内容,但似乎没有什么是完全正确的。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-3 routes


    【解决方案1】:

    我建议使用自定义路由处理程序,如下所示

    public class LanguageRouteHandler : IRouteHandler
        {
            public IHttpHandler GetHttpHandler(RequestContext requestContext)
            {
                IRouteHandler handler = new MvcRouteHandler();
                var vals = requestContext.RouteData.Values;
                if(vals["language"] == null)
                {
                    vals["language"] = "pt";
    
                }
                return handler.GetHttpHandler(requestContext);
            }
        }
    

    并且有另一个没有语言路由值的路由并设置它的路由处理程序(global.asax)

    routes.MapRoute(
                "Default2", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            ).RouteHandler = new LanguageRouteHandler();
    

    这不会将 Home/index 重定向到 pt/home/index,但它会为您的 index 操作方法(以及所有其他方法)提供 language = "pt"。如果你想重定向,你可以实现一个动作过滤器,但重定向会产生发布请求的问题。例如,当您将表单发布到 /home/index 并假设它被操作过滤器重定向时,重定向的请求将丢失已发布的表单数据

    【讨论】:

    • +1 @Muhammad Adeel Zahid - 除了覆盖 GetControllerInstance,我做了类似的事情。到目前为止它工作正常,没有自动重定向。我不确定什么是最好的实现,稍后我会尝试你的。
    【解决方案2】:

    你需要两条路由,一条不带语言,或者在最后加上语言参数

    【讨论】:

    • 但是怎么做呢?我可以在没有语言的情况下使用另一条路线,但是如何将 url 更改为带语言的路线?比如,如果我输入 domain.com 它会将我定向到 domain.com/pt/ ?
    【解决方案3】:

    试试这个

    routes.MapRoute(
            "Default", // Route name
            "{language}/{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
            new { language = @"(pt)|(es)|(en)" }
    );
    

    并以这种方式修改您的操作

    public ActionResult Index([DefaultValue("pt")] string language)
    {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多