为特定动作添加路由'Home'在行动的前面

本文关键字:前面 Home 添加 路由 | 更新日期: 2023-09-27 18:02:57

我在一个基本的ASP/MVC项目中遇到了一个奇怪的路由问题。

我有一堆导航项设置:

<li><a href="@Url.Action("index", "home")">Home</a></li>
<li><a href="@Url.Action("fire", "home")">Fire</a></li>
<li><a href="@Url.Action("law-enforcement", "home")">Law Enforcement</a></li>
<li><a href="@Url.Action("forensics", "home")">Forensics</a></li>
<li><a href="@Url.Action("reconstruction", "home")">Reconstruction</a></li>

它们都很好,除了第三个,标记为law-enforcement

当我把鼠标放在这个项目上时,URL是:http://localhost:54003/home/law-enforcement

当鼠标移到其他项目上时,URl为:http://localhost:54003/fire

我的控制器设置是:

public ActionResult Index()
{
    return View();
}
[Route("~/fire")]
public ActionResult Fire()
{
    return View();
}
[Route("~/law-enforcement")]
public ActionResult Law()
{
    return View();
}
[Route("~/forensics")]
public ActionResult Forensics()
{
    return View();
}
[Route("~/reconstruction")]
public ActionResult Reconstruction()
{
    return View();
}

我的路由配置是:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.LowercaseUrls = true;
    routes.MapMvcAttributeRoutes();
    routes.MapRoute("Default", "{controller}/{action}/{id}",
        new {controller = "Home", action = "Index", id = UrlParameter.Optional}
        );
}

当我去到URL指定的路由时,ASP响应一个404页面没有找到(它应该)。如果我去路由,我知道它应该是,如localhost/law-enforcement,然后正确的视图被渲染。

任何想法为什么ASP路由这个特定的动作不正确?

为特定动作添加路由'Home'在行动的前面

Razor Url.Action(...)不能引用控制器动作上[RouteAttribute]定义的路由;相反,它需要引用动作的名称。因此,将我的Razor语法更改为引用@Url.Action("law", "home")而不是@Url.Action("law-enforcement", "home")解决了这个问题。

你可以用以下两种方式保持你的url映射:

一种方法是用下面的属性来装饰你的actionresult:

// eg: /home/show-options
[Route("law-enforcement")] //Remove ~
public ActionResult Law() 
{
    return View();
}

根据docs

否则

Route.config文件中再添加一个配置

routes.MapRoute("SpecialRoute", "{controller}/{action}-{name}/{id}",
        new {controller = "Home", action = "law-enforcement", id = UrlParameter.Optional}
 );