我有Webapi服务控制器,它支持两个按参数区分的get方法
UNTIL
public class DailyRecordController : BaseApiController
{
private IDailyBroadcastRepository _repo;
public DailyRecordController(IDailyBroadcastRepository repo)
{
_repo = repo;
}
public IQueryable<DailyBroadcast> Get(DateTime? date=null)
{
var dailyBroadcastList = new List<DailyBroadcast>();
try
{
dailyBroadcastList = _repo.GetDailyBroadcastByDate(date??DateTime.Now).ToList();
}
catch (Exception ex)
{
//Log
}
return dailyBroadcastList.AsQueryable();
}
public DailyBroadcast Get(int? Id)
{
var dailyBroadcast = new DailyBroadcast();
try
{
dailyBroadcast = _repo.GetDailyBroadcastById(Id);
}
catch (Exception ex)
{
//Log
}
return dailyBroadcast;
}
}
当使用config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
方法调用方法api/DailyRecord/2017-06-01
时,请不要使用datetime参数访问该方法。
我也尝试过路由属性但不受影响。
id:integer
事实上,当我使用id参数传递第二个方法时,服务返回
[HttpGet]
[Route("{date:datetime}")]
如何使用两个支持datetime和integer参数的Get方法构建此控制器?
答案 0 :(得分:1)
使用字符串输入定义1 get方法,并使用TryParse验证输入是否以正确的格式输入。
Get(string val)
{
DateTime dt, int id;
if (DateTime.TryParse(val, out dt))
{
//Filter by date
}
else if (int.TryParse(val, out id))
{
//Filter by int
}
else
{
//Error state
}
}
答案 1 :(得分:1)
我通过实施this walkthrough
中所示的路线约束解决了这个问题通过向路径模板添加正则表达式约束,将路径限制为所需的格式:
[HttpGet]
[Route("{date:datetime:regex(\\d{4}-\\d{2}-\\d{2})}")]
public IQueryable<DailyBroadcast> GetByDate(DateTime date) {
//...
}
现在只有表格中的日期&#34; yyyy-mm-dd&#34;会匹配。请注意我们 不要使用正则表达式来验证我们是否有真正的约会。那是 Web API尝试将URI段转换为a时处理
DateTime
个实例。无效日期,例如&#39; 2012-47-99&#39;将失败 转换,客户端将收到404错误。