Che*_*hen 5 c# asp.net-mvc asp.net-mvc-4 asp.net-web-api
我通过以下步骤找到了此问题:
使用已安装的项目模板创建一个新的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时,它返回所有记录,否则返回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的源代码,我可以看到在找到正确的操作时忽略路由中定义的可选参数.就个人而言,我认为这真的很糟糕,即使是变通方法也很容易.或者我误解了路线和行动方法之间的关系?我认为路由是用于帮助请求查找其相应操作的规则,而"参数是可选的"恰好是规则的一部分.
您可以选择将值作为查询字符串
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)
我能够通过以下两种方式访问这条路线:
注意:除了默认路由之外,没有任何特殊路由
归档时间: |
|
查看次数: |
2856 次 |
最近记录: |