特定动作的路由在动作前面添加 'Home'
Routing for Particular Action Adds 'Home' In Front of Action
我在基本 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 错误地路由了这一特定操作吗?
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}
);
我在基本 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 错误地路由了这一特定操作吗?
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}
);