尝试www.example.com/id时出现MVC路由问题

时间:2016-05-11 19:44:04

标签: asp.net-mvc routing asp.net-mvc-5

假设我有一个网站www.example.com

默认路由看起来像

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional }
);

好的,工作正常但是当我转到www.example.com/id转到www.example.com/login/index/id

时我们想要我的网站

如何为此配置/添加路由,而不会破坏我实际尝试转到www.example.com/controller的其他页面?

编辑:不幸的是,id是一个字符串,所以我没有任何具体的约束,我能想到它会起作用。想想也许而不是id我应该说公司名称或网站名称,所以网址看起来像www.example.com/companyname。

到目前为止,我提出的唯一解决方案是为我的每个控制器添加一个maproute

routes.MapRoute(         名称:“家”,         url:“Home / {action} / {id}”,         默认值:new {controller =“Home”,action =“Index”,id = UrlParameter.Optional} );

routes.MapRoute(         名称:“设置”,         url:“设置/ {动作} / {id}”,         默认值:new {controller =“Settings”,action =“Index”,id = UrlParameter.Optional}     );

routes.MapRoute(         名称:“companyname”,         url:“{id}”,         默认值:new {controller =“Login”,action =“Index”,id = UrlParameter.Optional}     );

routes.MapRoute(         名称:“默认”,         url:“{controller} / {action} / {id}”,         默认值:new {controller =“Login”,action =“Index”,id = UrlParameter.Optional}     );

这会有效,但我有很多控制器,如果我将来添加一个控制器而忘记调整路径,它将会失败。这也不太可能,但如果一个公司名称与我的一个控制器名称相同,那么它也会失败。

3 个答案:

答案 0 :(得分:0)

在控制器中,您可以重定向到另一个控制器/操作:

public ActionResult yourAction()
{
  return  RedirectToAction("nameAction","nameController");
}

答案 1 :(得分:0)

您是否尝试过首先添加此映射:

routes.MapRoute( name: "Custom", url: "{id}", defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional } );

这应该有用,但请记住,路线是经过精心评估的,因此您必须组织映射才能覆盖您网站中的所有网页。

例如,www.example.com/Product等路线可能被错误地重定向到/登录。

编辑:您可以添加约束,因此如果id是int值,您可以尝试使用以下内容:

 routes.MapRoute("Custom", "{id}",
                new { controller = "Login", action = "Index" },
                new { id = @"\d+" }

编辑2:将id作为字符串值,我看到的唯一解决方案是按照你的说法手动添加每个控制器,或者添加如下内容:

routes.MapRoute(
name: "Default",
url: "app/{controller}/{action}/{id}",
defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional }

);

这样您将来不需要更新每条路线。

答案 2 :(得分:0)

请尝试以下路由

routes.MapRoute(name: "companylogin", url: "companylogin/{id}", defaults: new
        {
            controller = "Login",
            action = "Index",
            id = UrlParameter.Optional
        });

        routes.MapRoute(name: "default", url: "{controller}/{action}/{id}", defaults: new
        {
            controller = "Login",
            action = "Index",
            id = UrlParameter.Optional
        });

删除其他控制器特定的路由。现在您可以导航到使用登录 网址:-www.example.com/companylogin/{id}和所有其他网址重定向默认路由。