MVC.NET 路由

MVC.NET Routing

我想添加一个新的路由到我的网站Api,它将读取各种 id,然后过滤一堆书。

所以最后的 url 应该是 http://localhost/api/books/1/1/1/1

现在我已经在我的 RouteConfig 中添加了一条路线,如下所示:-

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "BookFilter",
            url: "api/books/{author}/{title}/{genre}/{isbn}",
            defaults: new { controller = "Books", action = "BookFilter" }
        );

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

    }

我还在 BooksController 中添加了以下内容:-

    [HttpGet]
    public IQueryable<BookDTO> BookFilter(int authorId, int titleId, int genreId, int isbn)
    {
        //filter books here
        return db.Books.ProjectTo<BookDTO>();
    }

但是,当我尝试访问该页面时,出现 404。

我需要做什么才能到达我的页面?

感谢您的帮助和时间

确保在您的操作中使用相同的参数名称(例如,将 author 更改为 authorId):

您也可以选择在 RouteConfig 中为这些参数指定默认值,如下所示:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "BookFilter",
            url: "api/books/{authorId}/{titleId}/{genreId}/{isbn}",
            defaults: new { controller = "Books", action = "BookFilter", authorId= UrlParameter.Optional, titleId = UrlParameter.Optional, genreId = UrlParameter.Optional, isbn = UrlParameter.Optional }
        );

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

    }

控制器:

    [HttpGet]
    public IQueryable<BookDTO> BookFilter(int authorId, int titleId, int genreId, int isbn)
    {
        //filter books here
        return db.Books.ProjectTo<BookDTO>();
    }

Web API 和 MVC 是独立的框架,各自有不同的类型。您的路线不起作用的可能原因是您混淆了两者。具体来说,要使其按照您的配置工作,您需要一个 MVC 控制器(即继承 System.Web.Mvc.Controller 的控制器)。

因此,假设您想像您的问题那样使用 Web API,您首先需要确保正确定义控制器。它应该继承自 System.Web.Http.ApiController.

public class BooksController : ApiController
{
    [HttpGet]
    public IHttpActionResult BookFilter(string author, string title, string genre, string isbn)
    {
        return Ok("Successful result");
    }
}

接下来,您需要将您的路由放在 WebApiConfig.cs 文件中,而不是 RouteConfig.cs 文件中。不要忘记从 RouteConfig.cs 文件中删除您的路线。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "BookFilter", 
            routeTemplate: "api/books/{author}/{title}/{genre}/{isbn}", 
            defaults: new { controller = "Books", action = "BookFilter" });

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

您还需要确保对 GlobalConfiguration.Configure(WebApiConfig.Register); 的调用在您的应用程序启动路径中(默认情况下在 Global.asax 中)。

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}