Amm*_*han 6 asp.net-mvc attributerouting
我已经定义了属性路由,它将两个参数作为datetime
[Route("{controller}/{action}/{*startDate:datetime}/{*endDate:datetime}")]
public bool OverView(DateTime startDate,DateTime endDate)
{
var dt = startDate.ToString("yyyy-MM-dd");
return true;
}
Run Code Online (Sandbox Code Playgroud)
但不确定,它是如何可能的.属性路由适用于单个参数,但不确定它如何适用于2个参数.此外,很难知道如何将两个参数与网址区分开来
单一的param,工作正常
http://domain.com/Home/overview/2014/02/01
两个参数的网址是什么?我尝试了下面的一个,但有一个例外
http://domain.com/Home/overview/2014/02/01/2014/02/04
Exception
A catch-all parameter can only appear as the last segment of the route URL.
Parameter name: routeUrl
Run Code Online (Sandbox Code Playgroud)
您应该通过其他方式格式化日期,而不是/因为它们是URL段分隔符...即使MVC支持多个贪婪段,中间应该至少有一个静态段,因此路由可以区分一个结束和第二个开始.
所以,如果你只是替换你的符号
/home/overview/2014/02/01
Run Code Online (Sandbox Code Playgroud)
至
/home/overview/2014-02-01
Run Code Online (Sandbox Code Playgroud)
您当前的路由几乎可以正常工作,路由参数很容易将模型绑定到datetime类型实例.您的行动方法的路线声明应如下:
[Route("{controller}/{action}/{startDate:datetime?}/{endDate:datetime?}")]
public ActionResult OverView(DateTime? startDate, DateTime? endDate)
{
...
}
Run Code Online (Sandbox Code Playgroud)
因此,如果你可以接受这个改变(/to -)那么这对你来说是最简单的解决方案,因为它不需要你编写任何自定义代码(即自定义模型绑定器)
有一个贪婪的路由参数并手动解析它.它将具有0,3或6个段.您应该能够手动解析这些.
[Route("{controller}/{action}/{*dateRange}")]
public ActionResult Overview(string dateRange)
{
int numberOfSegments = dateRange.Split('/').Length;
if (dateRange.EndsWith("/"))
{
numberOfSegments--;
}
switch (numberOfSegments)
{
case 0:
// no dates provided
...
break;
case 3:
// only one date provided
...
break;
case 6:
// two dates privided
...
break;
default:
// invalid number of route segments
...
break;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4552 次 |
| 最近记录: |