url.link error: A route named 'Default' could not be found in the route collection. Parameter name: name

url.link error: A route named 'Default' could not be found in the route collection. Parameter name: name

我正在开发一个 MVC 应用程序并尝试使用 Url.Link 函数来构建一个有效的 url。

下面是一些相关代码:

RouteConfig.cs

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

我试图在控制器中到达的路由(该函数的名称是 Manage - 它接受一个名为 id 的参数,该参数的类型为 guid:

[HttpGet]
[Route("manage/{id:guid}")]

呼叫Url.Link()

Url.Link("Default", new { Controller = "Users", Action = "Manage", id = aggregateId });

我试过这样命名属性:

[HttpGet]
[Route("manage/{id:guid}", Name="ManageUserRoute")]

然后像这样调用Url.Link()

url = Url.Link("ManageUserRoute", new { id = aggregateId });

我在使用这两种方法时都在标题中遇到了同样的错误。我该如何纠正?

您的示例混合了属性路由和基于约定的路由。

假设 UsersController 中的操作是 ActionResult Manage(Guid id),您可以通过

等基于约定的路由构造 link
Url.Link("Default", new { controller = "Users", action = "Manage", id = aggregateId });

注意 common/lower 案例 controlleraction “路由值”的名称用于组成 URL

更新

经过一些调查,我还注意到您没有提到这是针对 Web API 而不是 MVC。线索是 UrlHelper 的 MVC 版本中没有 Link 方法。

您收到该错误的可能性很大,因为 Web api 的默认基于约定的路由是 DefaultAPi 而不是 Default

// Convention-based routing.
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

这就是为什么在 http 路由映射的路由 table 中找不到 Default 路由名称的原因。您需要检查您的 WebApiConfig.cs 文件以获取您的 Web API.

的路由

所以你可能想要

Url.Link("DefaultApi", new { controller = "Users", action = "Manage", id = aggregateId });

对于 MVC 使用这个

Url.Action("inspsrc")

为我解决了同样的问题。

如果您的路由名称是 Default 或任何其他名称,请确保在名称 属性.

中指定它

示例:

       [Route("{id:int}", Name="Default")]
       public async Task<IHttpActionResult> Get(int id)

...
                      return CreatedAtRoute("Default",
                         new {  id = x },
                         _mapper.Map<MyModel>(talk));