MVC C# 自定义路由

MVC C# custom Routing

我有一个Controllerapi,下面的

routes.MapRoute(
  name: "api",
  url: "api/",
  defaults: new { controller = "api" }
);

在控制器内部我有一个动作如下

[Route("fleet/{id:guid}/selectedfleet")]
public ActionResult selectedfleet(Guid id)
{
    return null;
}

return null 只是为了测试一下,我正在尝试在其上设置断点 但是当我尝试访问 http://localhost:50593/api/fleet/2df3893d-c406-48fe-8443-1622ddc51af2/selectedfleet

之类的内容时,我发现 url 未找到

您在 Route 属性中定义的路由模式不包含术语 "api"。因此,根据您当前的路线定义,以下请求将起作用。

yourSiteBaseUrl/fleet/2df3893d-c406-48fe-8443-1622ddc‌​51af2/selectedfleet

或者您可以在路由定义中添加术语 api。

public class apiController : Controller
{
    [Route("api/fleet/{id:guid}/selectedfleet")]
    public ActionResult selectedfleet(Guid id)
    {
        return Content(id.ToString());
    }
}

或在控制器级别使用 RoutePrefix 属性

[RoutePrefix("api")]
public class apiController : Controller
{
    [Route("fleet/{id:guid}/selectedfleet")]
    public ActionResult selectedfleet(Guid id)
    {
        return Content(id.ToString());
    }
}

现在它适用于以下 url

yourSiteBaseUrl/api/fleet/0a5bb04d-4247-4cf6-8f96-2ce49325b5a7/selectedfleet

首先你需要确保如果你想在 MVC 中使用属性路由,它是启用的。

public class RouteConfig {

    public static void RegisterRoutes(RouteCollection routes) {

       routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

       routes.MapMvcAttributeRoutes(); //<--IMPORTANT for attribute routing in MVC

        // Convention-based routing.

        //...other code removed for brevity
    }
}

当尝试通过属性路由访问 http://localhost:50593/api/fleet/2df3893d-c406-48fe-8443-1622ddc51af2/selectedfleet 之类的内容时,您需要确保控制器定义了正确的路由模板来匹配请求。

[RoutePrefix("api")]
public class ApiController : Controller {

    //GET api/fleet/2df3893d-c406-48fe-8443-1622ddc51af2/selectedfleet
    [HttpGet]
    [Route("fleet/{id:guid}/selectedfleet")]
    public ActionResult selectedfleet(Guid id) { ... }
}

确保您的控制器和路由不冲突 Web API 路由,如果您将它包含在 MVC 项目中。