65

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

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

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

mysite/Controller/Action/200909211020

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

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

4

10 回答 10

42

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

如果您使用默认路由,则示例 url 的第三部分将获取 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();
}

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

于 2009-08-03T20:42:51.397 回答
39

尝试使用 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);
}
于 2015-01-29T16:17:33.610 回答
18

使用刻度值。重建为 DateTime 结构非常简单

 Int64 nTicks = DateTime.Now.Ticks;
 ....
 DateTime dtTime = new DateTime(nTicks);
于 2009-08-03T19:44:29.923 回答
6

我想我会与任何寻求类似答案的人分享 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

它按应有的方式对日期和时间进行编码。

于 2016-01-26T20:57:42.487 回答
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 参数都可以映射到操作方法参数。

于 2009-08-03T20:42:16.110 回答
1

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

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

使用级联 If 语句从传递到操作的参数中构建日期时间

    ' 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)

于 2012-12-10T23:14:24.617 回答
1

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

例如

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

更多信息在这里

于 2014-02-04T10:06:04.957 回答
1

我意识到它在像这样添加斜线后起作用

mysite/Controller/Action/21-9-2009 10:20/
于 2018-12-19T06:29:06.020 回答
0

您应该首先在 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 表示。

于 2009-08-03T19:40:15.343 回答
0

我也有同样的问题。我使用 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 ;
    }

我希望这个链接对你有帮助。

于 2020-09-28T18:48:23.727 回答