如何将带有参数的MVC应用基本地址路由到控制器

时间:2018-08-16 08:55:40

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

我的应用程序是一个非常简单的带有多个控制器的MVC 5网站。我有一个Home控制器,它具有这样的Index操作:

public ActionResult Index(string token)
{
   DoSomethingWithTheToken(token);
   return View();
}

现在,假设我的网站是www.my-special-website.com,我希望通过索引方法为 www.my-own-purpose-website.com/abcdefghijklmno 服务。

根据https://msdn.microsoft.com/en-us/library/cc668201.aspx中的可用信息,我设置了以下路线:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
   name: "Home",
   url: "{token}",
   defaults: new { controller = "Home", action = "Index", token = "{token}" });

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

不幸的是,当我导航到 www.my-special-website.com/abcdefghijklmno 时,收到“ 404资源未找到”响应。

谁能使它降落到所需的控制器并传递令牌参数?

1 个答案:

答案 0 :(得分:1)

我认为您收到定义路由的 404 错误是因为您已将应用程序的路由定义为:

public static void RegisterRoutes(RouteCollection routes)
{
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

您可以将其用作:

public static void RegisterRoutes(RouteCollection routes)
{
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            name:"myroute",
            url:"{token}",
            defaults: new { controller = "Home", action = "MyIndex", token = "{token}" }
            );
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
}

注1::添加到路由表中的路由的顺序很重要。我们的新自定义路由应在现有默认路由之前添加。如果您颠倒了顺序,则总是会调用默认路由,而不是自定义路由。

注意2::如果将路由定义为url:{token}将会引起问题,因为所有传入的路由都只是控制器名称ex: www.mywebsite.com/Home,这里是{{1} }将被视为令牌。因此,为了处理这种情况,大多数人都会在有或没有Identity Server的情况下使用filters之类的Authentication filters。这是how to add an authentication filter的基本实现。