MVC.NET路由

时间:2016-06-01 12:46:29

标签: asp.net-mvc asp.net-web-api2 url-routing asp.net-mvc-routing asp.net-web-api-routing

我想在我的Web Api中添加一条新路径,它会读取各种ID,然后过滤掉一堆书。

所以最后的网址应该是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。

要访问我的网页需要做什么?

感谢您的帮助和时间

2 个答案:

答案 0 :(得分:2)

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);
    }
}

答案 1 :(得分:0)

确保在您的操作中使用相同的参数名称(例如,将 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>();
    }