【问题标题】:How can I stop multiple routes matching in MVC?如何在 MVC 中停止多个路由匹配?
【发布时间】:2012-10-05 18:00:23
【问题描述】:

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

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

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

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

找到多个与请求匹配的操作: VenuefinderWebAPI.Models.Venue Get(Int32) on type 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
}

【问题讨论】:

  • 它们看起来是多余的......你认为第二条路线应该采取什么行动?

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


【解决方案1】:

试试这个...

更改您的场地控制器:

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+" }
);

*为路线添加了 Mike 的约束。

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

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

【讨论】:

  • 谢谢 - 我喜欢这种方法。
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢!我喜欢约束的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 2011-08-12
  • 1970-01-01
  • 2022-01-07
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多