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);
}
}
我想添加一个新的路由到我的网站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);
}
}