我通过以下步骤找到了这个问题:
从现在开始一切都按我预期的方式运作。 但是我无法移动路由中的“defaults”参数。 这意味着:代码将ids参数声明为可选两次。
查看位于System.Web.Http.Controllers.ActionSelectorCacheItem.FindActionUsingRouteAndQueryParameters方法的MVC4源代码,我可以看到在查找正确的操作时忽略了在路由中定义的可选参数。 我个人认为这很糟糕,即使解决方法也很简单。 或者我误解了路由和操作方法之间的关系? 我认为路由是用来帮助请求找到其相应操作的规则,而“参数是可选的”正是规则的一部分。
使用已安装的项目模板创建一个新的WebApi项目
转到Controllers / ValuesController.cs,有两个像这样的Get方法:
public IEnumerable<string> Get()
//此方法提供GetAll函数public string Get(int id)
//此方法是GetOneById我不喜欢这种设计,因为我认为这两个API方法可以合并为一个:
public IEnumerable<string> Get(string ids)
当ids为空时,它返回所有记录,否则根据ids返回结果(看起来像id1,id2,id3 ...)
我还修改了路由:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{ids}",
defaults: new { ids = RouteParameter.Optional }
);
现在我认为一切都准备好了,但是当我在浏览器中访问/values
(没有指定ids参数)时,会提示“未找到任何操作”,直到我为ids
添加了默认值:
public IEnumerable<string> Get(string ids = null)
从现在开始一切都按我预期的方式运作。 但是我无法移动路由中的“defaults”参数。 这意味着:代码将ids参数声明为可选两次。
查看位于System.Web.Http.Controllers.ActionSelectorCacheItem.FindActionUsingRouteAndQueryParameters方法的MVC4源代码,我可以看到在查找正确的操作时忽略了在路由中定义的可选参数。 我个人认为这很糟糕,即使解决方法也很简单。 或者我误解了路由和操作方法之间的关系? 我认为路由是用来帮助请求找到其相应操作的规则,而“参数是可选的”正是规则的一部分。