C# MVC3路由/重定向问题
我的应用程序是多语言的,为了处理这些语言,我编写了以下路径:C# MVC3路由/重定向问题,c#,asp.net-mvc,asp.net-mvc-3,routes,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",
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的文章,但似乎没有什么是正确的。您需要两条路由,另一条没有语言,或者在末尾添加语言参数您需要两条路由,另一条没有语言,或者在末尾添加语言参数试试这个
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)
{
...
}
试试这个
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)
{
...
}
我建议使用如下自定义路由处理程序
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)
这不会将Home/index重定向到pt/Home/index,但会为索引操作方法(以及所有其他方法)提供language=“pt”。如果你想重定向,你可以实现一个actionfilter,但是重定向会给post请求带来问题。例如,当您将表单发布到/home/index,并假设它由操作筛选器重定向时,重定向的请求将丢失已发布的表单数据我建议使用如下自定义路由处理程序
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)
这不会将Home/index重定向到pt/Home/index,但会为索引操作方法(以及所有其他方法)提供language=“pt”。如果你想重定向,你可以实现一个actionfilter,但是重定向会给post请求带来问题。例如,当您将表单发布到/home/index,并假设它由操作筛选器重定向时,重定向的请求将丢失已发布的表单数据,但如何操作?我可以有另一条没有语言的路线,但是如何将url更改为有语言的?比如,如果我键入domain.com,它会将我指向domain.com/pt/?但是如何?我可以有另一条没有语言的路线,但是如何将url更改为有语言的?比如,如果我键入domain.com,它会将我指向domain.com/pt/?+1@Muhammad Adeel Zahid-我做了类似的事情,除了覆盖GetControllerInstance。到目前为止它还在工作,没有自动重定向。我不确定什么是最好的实现,稍后我将尝试您的实现。+1@Muhammad Adeel Zahid-我做了一些类似的事情,除了覆盖GetControllerInstance。到目前为止它还在工作,没有自动重定向。我不确定什么是最好的实现,稍后我将尝试您的实现。