MVC3路由/重定向问题

时间:2011-07-02 13:49:05

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

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

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的内容,但似乎没有什么是正确的。

3 个答案:

答案 0 :(得分:3)

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

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,但它会为您的索引操作方法(以及所有其他方法)提供language =“pt”。如果你想重定向你可以实现一个actionfilter但重定向会产生post请求的问题。例如,当您将表单发布到/ home / index并假设它被动作过滤器重定向时,重定向的请求将丢失已发布的表单数据

答案 1 :(得分:1)

您需要两条路线,另一条路线没有语言,或者在末尾添加语言参数

答案 2 :(得分:0)

试试这个

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)
{
    ...
}