如何在MVC中停止多个路由匹配?

时间:2012-10-05 08:48:07

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api

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

我正在尝试使用以下网址格式:

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

第二个URL模式工作正常,但如果我尝试访问第一个,我收到一个错误,上面写着:

  

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

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

在我的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
}

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分: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方法。

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