自定义路由 ASP.NET MVC

Custom routing ASP.NET MVC

所以我想让我的 URL 看起来像这样:

example.comexample.com/contactexample.com/sign-upexample.com/account

而不是默认的 MVC 方式,它看起来像:

example.comexample.com/Home/Contactexample.com/Account/SignUpexample.com/Account/Account

所有 HomeController 视图都工作正常,但我的 AccountController 不工作。

example.com/account 时我收到一条错误消息:

The resource cannot be found.

这是我的 RouteConfig:

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

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

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

并且因为我想将 Account/SignUp 视图显示为 /sign-up,所以我在 AccountController.

中添加了一些自定义代码
// GET: Account
public ActionResult Account()
{
    return View();
}

// GET: Sign Up
[ActionName("Sign-Up")]
public ActionResult SignUp()
{
    return View("SignUp");
}

两种格式 /account/account/account 都给我与之前相同的错误。 然而 /about/contact 等却没有。​​

感谢任何帮助,谢谢!

P.S 这是我的文件夹结构:

> Views
-> Account
--> Account.cshtml
--> SignUp.cshtml
-> Home
--> About.cshtml
--> Contact.cshtml
--> Index.cshtml

也许自定义路由应该在默认路由之前

路由设置需要更明确。

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

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

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

添加RouteConfig.cs:

routes.MapMvcAttributeRoutes();

添加 AccountController.cs 作为 SignUp 方法的属性

[Route("Sign-Up")]

最后:

RouteConfig.cs

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

    routes.MapMvcAttributeRoutes();

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

AccountController.cs

[Route("Sign-Up")]
public ActionResult SignUp()
{
  ViewBag.Message = "Your application description page.";

  return View();
}

Result