如何在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; }
    }
}

如何在MVC中使用/配置路由

你能试着把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 = "")