Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC3路由/重定向问题_C#_Asp.net Mvc_Asp.net Mvc 3_Routes - Fatal编程技术网

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。到目前为止它还在工作,没有自动重定向。我不确定什么是最好的实现,稍后我将尝试您的实现。