选择操作时,ASP.NET Web Api会忽略RouteParameter.Optional

Che*_*hen 5 c# asp.net-mvc asp.net-mvc-4 asp.net-web-api

我通过以下步骤找到了此问题:

  1. 使用已安装的项目模板创建一个新的WebApi项目

  2. 转到Controllers/ValuesController.cs,有两个这样的Get方法:

    public IEnumerable<string> Get() //这个提供了GetAll功能

    public string Get(int id) //这个是GetOneById

  3. 我不喜欢这个设计,因为我认为两个api方法可以组合成一个:

    public IEnumerable<string> Get(string ids) 当ids为null时,它返回所有记录,否则返回id的结果(看起来像id1,id2,id3 ......)

我也修改了路线:

    config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{ids}",
            defaults: new { ids = RouteParameter.Optional }
        );
Run Code Online (Sandbox Code Playgroud)

现在我觉得一切都准备好了.但是当我/values在浏览器中访问时(没有指定ids参数),我被告知"没有找到任何操作",直到我添加一个默认值ids:

public IEnumerable<string> Get(string ids = null)
Run Code Online (Sandbox Code Playgroud)

从现在开始,一切都按照我的预期运作.我仍然无法defaults在路线中移动参数.这意味着:代码将ids参数声明为可选两次.

查看位于System.Web.Http.Controllers.ActionSelectorCacheItem.FindActionUsingRouteAndQueryParameters方法的MVC4的源代码,我可以看到在找到正确的操作时忽略路由中定义的可选参数.就个人而言,我认为这真的很糟糕,即使是变通方法也很容易.或者我误解了路线和行动方法之间的关系?我认为路由是用于帮助请求查找其相应操作的规则,而"参数是可选的"恰好是规则的一部分.

Mik*_*ike 1

您可以选择将值作为查询字符串

public class PaymentsController : ApiController {
        [HttpGet]
        public Person GetValues(string ids = null)
        {
            return new Person() { FirstName = "Michael" };
        }
    }

    public class Person
    {
        public string FirstName { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我能够通过以下两种方式访问​​这条路线:

  1. /api/付款/getvalues/?ids=123
  2. /api/付款/getvalues/

注意:除了默认路由之外,没有任何特殊路由