我的应用程序是多语言的,我编写了以下路线来处理语言:
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.com
和domain.com/pt/home/index
。但是,如果我输入domain.com/home/index
,则会失败(404)。
所需的行为是被重定向到domain.com/pt/home/index
(pt是默认语言)。
最好的方法是什么?我一直在阅读很多关于路线和ActionFilters的内容,但似乎没有什么是正确的。
答案 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)
{
...
}