【问题标题】:How do I pass a datetime value as a URI parameter in asp.net mvc?如何在 asp.net mvc 中将日期时间值作为 URI 参数传递?
【发布时间】:2010-11-16 11:43:53
【问题描述】:

我需要一个具有日期时间值的操作参数吗?有没有标准的方法来做到这一点?我需要有类似的东西:

mysite/Controller/Action/21-9-2009 10:20

但我只是通过以下方式成功地做到了:

mysite/Controller/Action/200909211020

并编写一个自定义函数来处理这种格式。

再次,寻找标准或认可的 ASP.net MVC 方法来执行此操作。

【问题讨论】:

    标签: asp.net-mvc datetime uri


    【解决方案1】:

    您的第一个示例网址中的冒号会导致错误(错误请求),因此您无法完全按照您的要求进行操作。除此之外,绝对可以使用 DateTime 作为操作参数。

    如果您使用默认路由,则示例网址的第三部分将获取 DateTime 值作为 {id} 参数。所以你的 Action 方法可能看起来像这样:

    public ActionResult Index(DateTime? id)
    {
        return View();
    }
    

    您可能希望像我一样使用 Nullable Datetime,因此如果不包含此参数,它不会导致异常。当然,如果您不希望将其命名为“id”,请添加另一个路由条目,将 {id} 替换为您选择的名称。

    只要 url 中的文本将解析为有效的 DateTime 值,这就是您所要做的。类似以下的东西可以正常工作,并且会在您的 Action 方法中被拾取而不会出现任何错误:

    <%=Html.ActionLink("link", "Index", new { id = DateTime.Now.ToString("dd-MM-yyyy") }) %>
    

    在这种情况下,问题当然是我没有包括时间。我不确定是否有任何方法可以格式化(有效)日期字符串,其时间不以冒号表示,因此如果您必须在 url 中包含时间,您可能需要使用自己的格式并将结果解析回手动日期时间。假设我们用“!”替换冒号在操作链接中:new { id = DateTime.Now.ToString("dd-MM-yyyy HH!mm") }

    您的操作方法将无法将其解析为日期,因此在这种情况下最好的选择可能是将其作为字符串接受:

    public ActionResult Index(string id)
    {
        DateTime myDate;
        if (!string.IsNullOrEmpty(id))
        {
            myDate = DateTime.Parse(id.Replace("!", ":"));
        }
        return View();
    }
    

    编辑: 正如 cmets 中所述,还有一些其他的解决方案可以说比我的更好。当我最初写这个答案时,我相信我试图尽可能地保留日期时间格式的本质,但显然 URL 编码将是一种更合适的处理方式。 +1 对弗拉德的评论。

    【讨论】:

    • 感谢您提供全面的概述。我确实需要接收时间作为参数的一部分,因为这是一种路线应用程序,其中行程有所需的时间。所以我想我会坚持我的自定义格式方法。
    • 完全可以通过查询字符串传递日期和时间值,而无需使用 Replace("!", ":") 之类的技巧。您只需对分号进行 url 编码 - 您可以使用 encodeURIComponent 方法在 Javascript 中执行此操作。
    • 您可以只传入日期,然后传入一个整数值作为第二个参数,该参数是从午夜开始的秒/分钟,然后只需将它们重新添加到操作中
    • 谢谢你的回答,我用过这种类型:)
    【解决方案2】:

    尝试使用 toISOString()。它返回 ISO8601 格式的字符串。

    来自 javascript

    $.get('/example/doGet?date=' + new Date().toISOString(), function (result) {
        console.log(result);
    });
    

    来自 C#

    [HttpGet]
    public JsonResult DoGet(DateTime date)
    {
        return Json(date.ToString(), JsonRequestBehavior.AllowGet);
    }
    

    【讨论】:

    • 这是一个非常巧妙的解决方案
    • 对我来说,这是最好的方法,它为您提供了一种序列化 Date 对象的标准方法,并且仍然具有人类可读性。在 C# 中,您可以使用 dateTimeObject.ToString("o") 序列化为 ISO8601
    • 在我看来,这是最好的答案。在控制器操作中不搞乱解析字符串,也不搞乱字符串连接来创建查询参数。干净、规范。 (......并且有效!)
    • 哇,这是极好的标准解决方案,而不是传递和日期格式,时间戳更好和标准
    • 就我而言,它仅在日期过去时才有效。如果参数中包含时间,则找不到方法。
    【解决方案3】:

    使用刻度值。重建成 DateTime 结构很简单

     Int64 nTicks = DateTime.Now.Ticks;
     ....
     DateTime dtTime = new DateTime(nTicks);
    

    【讨论】:

    • 这很整洁。我喜欢我的解决方案的一点是 URI 仍然可读。
    【解决方案4】:

    我想我会与任何寻求类似答案的人分享 MVC5 中对我有用的东西。

    我的控制器签名如下所示:

    public ActionResult Index(DateTime? EventDate, DateTime? EventTime)
    {
    
    }
    

    我的 ActionLink 在 Razor 中如下所示:

    @Url.Action("Index", "Book", new { EventDate = apptTime, EventTime = apptTime})
    

    这给出了一个这样的 URL:

    Book?EventDate=01%2F20%2F2016%2014%3A15%3A00&EventTime=01%2F20%2F2016%2014%3A15%3A00
    

    它应该对日期和时间进行编码。

    【讨论】:

      【解决方案5】:

      ASP .NET MVC 的 URI 的典型格式是 Controller/Action/Id,其中 Id 是一个整数

      我建议将日期值作为参数发送,而不是作为路由的一部分:

       mysite/Controller/Action?date=21-9-2009 10:20
      

      如果它仍然给您带来问题,则日期可能包含 URI 中不允许使用且需要编码的字符。签出:

       encodeURIComponent(yourstring)
      

      它是 Javascript 中的一个方法。

      在服务器端:

      public ActionResult ActionName(string date)
      {
           DateTime mydate;
           DateTime.Tryparse(date, out mydate);
      }
      

      仅供参考,只要名称相同,任何 url 参数都可以映射到 action 方法参数。

      【讨论】:

        【解决方案6】:

        拆分年、月、日小时和分钟

        routes.MapRoute(
                    "MyNewRoute",
                    "{controller}/{action}/{Year}/{Month}/{Days}/{Hours}/{Mins}",
                    new { controller="YourControllerName", action="YourActionName"}
                );
        

        使用级联 If 语句从传递给 Action 的参数构建日期时间

            ' Build up the date from the passed url or use the current date
            Dim tCurrentDate As DateTime = Nothing
            If Year.HasValue Then
                If Month.HasValue Then
                    If Day.HasValue Then
                        tCurrentDate = New Date(Year, Month, Day)
                    Else
                        tCurrentDate = New Date(Year, Month, 1)
                    End If
                Else
                    tCurrentDate = New Date(Year, 1, 1)
                End If
            Else
                tCurrentDate = StartOfThisWeek(Date.Now)
            End If
        

        (为 vb.net 道歉,但你明白了:P)

        【讨论】:

          【解决方案7】:

          从 MVC 5 开始,您可以使用支持 datetime 类型的内置 Attribute Routing 包,该包将接受任何可以解析为 DateTime 的内容。

          例如

          [GET("Orders/{orderDate:datetime}")]
          

          更多信息here

          【讨论】:

            【解决方案8】:

            我意识到像这样在后面添加斜线后它可以工作

            mysite/Controller/Action/21-9-2009 10:20/
            

            【讨论】:

              【解决方案9】:

              您应该首先在 global.asax 中添加一条新路由:

              
              routes.MapRoute(
                              "MyNewRoute",
                              "{controller}/{action}/{date}",
                              new { controller="YourControllerName", action="YourActionName", date = "" }
                          );
              

              在你的控制器上:

              
              
                      public ActionResult MyActionName(DateTime date)
                      {
              
                      }
              

              请记住将默认路由保留在 RegisterRoutes 方法的底部。请注意,引擎将尝试将您在 {date} 中发送的任何值转换为 DateTime 示例,因此如果无法转换,则会引发异常。如果您的日期字符串包含空格或 : 您可以对它们进行 HTML.Encode 以便正确解析 URL。如果不是,那么您可以有另一个 DateTime 表示。

              【讨论】:

                【解决方案10】:

                我也有同样的问题。我使用 DateTime.Parse 方法。并在 URL 中使用此格式传递我的 DateTime 参数 2018-08-18T07:22:16

                有关使用 DateTime Parse 方法的更多信息,请参阅此链接:DateTime Parse Method

                string StringDateToDateTime(string date)
                    {
                        DateTime dateFormat = DateTime.Parse(date);
                        return dateFormat ;
                    }
                

                希望此链接对您有所帮助。

                【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2011-08-29
                • 1970-01-01
                • 1970-01-01
                • 2017-10-17
                • 2019-04-29
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多