3

我是 MVC 新手,但我正在尝试创建 MVC Web API,但我遇到了路由问题。

我正在尝试使用以下 URL 模式:

/api/venue/1999          // doesn't work
/api/venue/1999/images/  // works

第二个 URL 模式工作正常,但如果我尝试访问第一个,我会收到一条错误消息:

找到与请求匹配的多个操作: VenuefinderWebAPI.Controllers.VenueController 类型上的 VenuefinderWebAPI.Models.Venue Get(Int32) System.String[] Images(Int32) 类型 VenuefinderWebAPI.Controllers.VenueController

我不确定是我的路由错误(多个匹配)还是我的控制器类中的某些东西。如何解决这个问题?

在我的 webApiConfig 我有这个:

config.Routes.MapHttpRoute(
    name: "VenueImages",
    routeTemplate: "api/venue/{venueID}/images/",
    defaults: new { controller="Venue", action = "images" }
);

config.Routes.MapHttpRoute(
    name: "VenueDefault",
    routeTemplate: "api/venue/{venueID}",
    defaults: new { controller = "Venue" }
);

VenueController.cs 有:

// GET api/venue/5
public Venue Get(int venueID)
{
  // code
}

and 
[HttpGet]
[ActionName("images")]
string[] Images(int venueID)
{
   // code
}
4

2 回答 2

3

您可以尝试添加一个默认操作,如下所示:

config.Routes.MapHttpRoute(
    name: "VenueDefault",
    routeTemplate: "api/venue/{venueID}",
    defaults: new { controller = "Venue", action = "Venue" },
    new { venueID = @"\d+" }
);

请注意,我还在场地 ID 上添加了一个约束,因此它只匹配整数

于 2012-10-05T09:31:35.813 回答
3

试试这个...

更改您的场地控制器:

public string Get(int venueID)
{
    // code
}

[HttpGet]
public string[] Images(int venueID)
{
    // code
}

改变你的路线:

config.Routes.MapHttpRoute(
    name: "VenueDefault",
    routeTemplate: "api/venue/{venueID}/{action}",
    defaults: new { controller = "Venue", action = "get" },
    constraints: new { venueID = @"\d+" }
);

*添加了迈克对路线的约束。

--- 上面做了什么 ---
路由匹配 url,其中的venueID 是一个数字,除非另有说明,否则 action 方法默认为 get 方法。

请记住,操作方法是您在控制器中的方法。

于 2012-10-05T10:00:23.960 回答