6

我已经定义了属性路由,它将两个参数作为日期时间

  [Route("{controller}/{action}/{*startDate:datetime}/{*endDate:datetime}")]
        public bool OverView(DateTime startDate,DateTime endDate)
        {
            var dt = startDate.ToString("yyyy-MM-dd");
            return true;
        }

但不确定,怎么可能。属性路由适用于单个参数,但不确定它如何适用于 2 个参数。也很难知道它将如何从 url 中区分两个参数

单个参数工作正常

http://domain.com/Home/overview/2014/02/01

两个参数的 url 是什么?我尝试了下面的但有一个例外

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
4

1 回答 1

7

第一种可能性

您应该通过其他方式格式化您的日期,而不是/因为它们是 URL 段分隔符......即使 MVC 支持多个贪婪段,之间也应该至少有一个静态段,以便路由能够区分一个结束和第二个开始。

所以如果你只是替换你的符号

/home/overview/2014/02/01

/home/overview/2014-02-01

您当前的路由几乎可以工作,并且路由参数很容易将模型绑定到datetime类型实例。您对操作方法的路由声明应如下所示:

[Route("{controller}/{action}/{startDate:datetime?}/{endDate:datetime?}")]
public ActionResult OverView(DateTime? startDate, DateTime? endDate)
{
    ...
}

因此,如果您可以接受此更改(/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;
    }
}
于 2014-02-06T23:12:10.527 回答