【问题标题】:Custom routing ASP.NET MVC自定义路由 ASP.NET MVC
【发布时间】:2020-04-15 11:07:21
【问题描述】:

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

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 时,我收到一条错误消息:

找不到资源。

这是我的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

【问题讨论】:

  • 你有没有试过把你的路线改成这样的? url: "/Account/{action}/{id}",
  • @LukeAlderton 成功了!

标签: c# asp.net-mvc asp.net-mvc-routing


【解决方案1】:

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

【讨论】:

  • 不幸的是,这会将主页设置为Account页面。
  • 也许你应该在这里查看更多信息:docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions-1/…
  • 这来自 Microsoft 文档:添加到路由表的路由顺序很重要。我们的新自定义路由添加在现有默认路由之前。如果您颠倒了顺序,那么将始终调用默认路由而不是自定义路由。
【解决方案2】:

路由设置需要更加明确。

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 }
    );
}

【讨论】:

  • 是的,我意识到我必须像 account/sign-up 一样拥有它,而不仅仅是 sign-up。这有点不幸,但如果这是我真正想要的,我可以轻松地将其添加到 HomeController
【解决方案3】:

添加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

【讨论】:

    猜你喜欢
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多