【发布时间】:2012-11-26 05:39:16
【问题描述】:
我通过以下步骤发现了这个问题:
使用已安装的项目模板创建一个新的 WebApi 项目
-
进入Controllers/ValuesController.cs,有两个Get方法如下:
public IEnumerable<string> Get()//这个提供GetAll函数public string Get(int id)// 这个是 GetOneById -
我不喜欢这样的设计,因为我觉得这两个api方法可以合二为一:
public IEnumerable<string> Get(string ids)当ids为null时,返回所有记录,否则按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 的源代码,我可以看到在找到正确的操作 时忽略了路由中定义的可选参数。我个人认为这真的很糟糕,即使解决方法也很容易。还是我误解了路线和动作方法之间的关系?我认为路由是用于帮助请求找到其相应操作的规则,而“参数是可选的”正是规则的一部分。
【问题讨论】:
标签: c# asp.net-mvc asp.net-mvc-4 asp.net-web-api