标准MVC 5模板。
所以我试图理解并创建一个命名路由,如:
<a href="@Url.RouteUrl(routeName: "myroute", routeValues: new { code = "123" })">this link</a>
在家庭控制器中:
[Route("Home/DoIt", Name = "myroute"), HttpGet]
public ActionResult DoIt(string code)
{
return View();
}
当然在RoutConfig.cs中启用了MvcAttributeRouting:
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.MapMvcAttributeRoutes();
}
因为如果没有启用,会得到:
在路径集合中找不到名为“myroute”的路线。 参数名称:名称
但我得到了:
无法找到资源。描述:HTTP 404.资源你 正在寻找(或其中一个依赖)可能已被删除, 更改名称,或暂时不可用。请查阅 以下网址,并确保拼写正确。
请求的网址:/ Home / DoIt
我做错了什么?
编辑:显然,我在使用Route属性做错了,因为即使这样也行不通: [Route("DoIt")]
或
[Route("Home/DoIt")]
,两者都会给我404
答案 0 :(得分:4)
放置MapMvcAttributeRoutes
行的 订单 非常重要。你把它放在错误的位置。必须在默认路由之前调用它。
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// Add this to get attribute routes to work
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
路由的工作方式类似于switch case语句。 第一个匹配获胜。但是如果你首先放置默认路由,它将匹配每个具有0,1,2或3段的URL,并有效地覆盖那些长度的任何属性路由。
答案 1 :(得分:0)
您是否尝试过直接从浏览器访问操作?我的意思是YourHost / Home / DoIt。如果它也引发404错误,那么您的问题可能来自您的路由配置。
可能您没有启用路由属性配置。检查以下内容: 来自MSDN:
要启用属性路由,请在调用期间调用MapMvcAttributeRoutes 配置。
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
}
}