如何在MVC中使用/配置路由
本文关键字:配置 路由 MVC | 更新日期: 2023-09-27 18:12:38
当它被称为/api/Games/aaa时,我想要运行方法Get(string deviceId = "")
。但是当它被称为api/Games/GameById/TaskId时,我想要方法GameById(int id)
运行。但是行不通,尤其是第二种方法。
控制器:
public class GamesController : ApiController
{
private List<Game> _gamesRepository;
public GamesController()
{
_gamesRepository = CreateGamesRepository();
}
// GET api/Games/DeviceId
[HttpGet]
public IEnumerable<Game> Get(string deviceId = "")
{
IEnumerable<Game> result;
if (String.IsNullOrEmpty(deviceId))
{
result = _gamesRepository.AsEnumerable();
}
else
{
result = _gamesRepository.Where(x => x.DeviceId == deviceId).AsEnumerable();
}
return result;
}
// GET api/Games/GameById/Id
[HttpGet]
public IEnumerable<Game> GameById(int id)
{
IEnumerable<Game> result;
result = _gamesRepository.Where(x => x.TaskId == id).AsEnumerable();
return result;
}
路由:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "GamesRoute",
url: "api/{controller}/{deviceId}",
defaults: new { controller = "controller", action = "get", deviceId = UrlParameter.Optional }
);
routes.MapRoute(
name: "GamesRoute2",
url: "api/games/GameById/{id}",
// defaults: new { id = UrlParameter.Optional }
defaults: new { controller = "games", action = "GameById" },
constraints: new { id = @"'d+" }
);
模型:
public class Game
{
public int TaskId { get; set; }
public string SalesForceId { get; set; }
public string Name { get; set; }
public string Thumbnail { get; set; }
public string DeviceId { get; set; }
}
}
你能试着把RouteParameters设置为可选的吗?
defaults: new { id = RouteParameter.Optional }
你的地图路由顺序很重要,因为第一个匹配的路由获胜,框架停止寻找更多的路由。
一般路由应添加在更具体的路由之后。
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
config.Routes.MapRoute(
name: "GamesRoute2",
routeTemplate: "api/games/GameById/{id}",
defaults: new { controller = "games", action = "GameById" },
constraints: new { id = @"'d+" }
);
config.Routes.MapRoute(
name: "GamesRoute",
routeTemplate: "api/{controller}/{deviceId}",
defaults: new { controller = "controller", action = "get", deviceId = UrlParameter.Optional }
);
}
}
我个人认为你不需要在你的Web API配置中映射每一条路由。使用可持续的体系结构,并支持您想要使用的设计类型。
在您的情况下,我将使用WebApiConfig中的配置为我的api使用更具描述性的URI:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
这样做是允许你在你的URI中指定一个/action
,让你在调用中非常明确。您的端点将变成:
/api/games/getById?id=1
/api/games/get?"Test"
编辑
如果你想要一个完全匹配api/games/{parameter}
的路由,那么我会在该方法上添加一个路由属性,像这样:
[Route("api/games/{id}")]
public IEnumerable<Game> Get(string deviceId = "")