【问题标题】:Attribute Routing for Multiple DateTime parameters多个 DateTime 参数的属性路由
【发布时间】:2014-03-02 07:36:16
【问题描述】:

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

  [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

【问题讨论】:

    标签: asp.net-mvc attributerouting


    【解决方案1】:

    第一种可能性

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

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

    /home/overview/2014/02/01
    

    /home/overview/2014-02-01
    

    您当前的路由几乎可以工作,并且路由参数很容易将模型绑定到datetime 类型实例。你的 action 方法的路由声明应该是这样的:

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

    因此,如果您可以接受这种更改(/-),那么这对您来说是最简单的解决方案,因为它不需要您编写任何自定义代码(即自定义模型绑定器)

    第二种可能性

    有一个贪婪的路由参数并手动解析它。它将有 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;
        }
    }
    

    【讨论】:

    • 我对第一种可能性感兴趣。你能举个例子吗?谢谢
    • @user2866746:这些日期是由用户手动输入的还是会是@Html.ActionLink的结果?因为这样我们可以决定日期格式
    • 这将由用户输入,格式为 yyyy/mm/dd。这有帮助吗?
    • @user2866746:检查我编辑的第一个选项的答案。
    猜你喜欢
    • 1970-01-01
    • 2017-06-26
    • 2014-10-18
    • 2018-12-31
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    相关资源
    最近更新 更多