如何在asp.net mvc中将date时间值作为URIparameter passing?

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

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

但我只是用类似的方法成功地实现了它:

 mysite/Controller/Action/200909211020 

并写一个客户函数来处理这种格式。

再次,寻找一个标准或制裁的ASP.net MVC方式来做到这一点。

你的第一个例子的url冒号会导致一个错误(错误的请求),所以你不能做你正在寻找什么。 除此之外,使用DateTime作为动作参数是绝对有可能的。

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

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

你可能会想要使用Nullable Datetime,所以如果不包含这个参数,它不会导致exception。 当然,如果你不希望它被命名为“id”,那么添加另一个路由条目,用你select的名字replace{id}。

只要url中的文本将parsing为有效的date时间值,这就是你所要做的。 像下面的东西很好,并会在你的Action方法中没有任何错误:

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

这种情况当然就是我没有包括时间。 我不确定有什么方法可以用不用冒号表示的时间格式化一个(有效的)datestring,所以如果你必须在URL中包含时间,你可能需要使用你自己的格式并将结果parsing回一个DateTime手动。 假设我们用“!”代替冒号 在actionlink: new { id = DateTime.Now.ToString("dd-MM-yyyy HH!mm") }

你的行为方法将无法parsing这个date,所以在这种情况下最好的select可能会接受它作为一个string:

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

编辑:正如在评论中指出的,还有一些其他的解决scheme比我的更好。 当我最初写这个答案时,我相信我试图尽可能地保留date时间格式的本质,但是显然URL编码是处理这个问题的更合适的方式。 +1给Vlad的评论。

尝试使用toISOString()。 它以ISO8601格式返回string。

从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); } 

使用刻度值。 重build成DateTime结构非常简单

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

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

我build议发送date值作为参数,而不是路由的一部分:

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

如果仍然有问题,date可能包含URI中不允许的字符,需要编码。 查看:

  encodeURIComponent(yourstring) 

这是Javascript中的一个方法。

在服务器端:

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

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

我以为我会分享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 

它编码date和时间,因为它应该。

从MVC 5开始,您可以使用内置的属性路由软件包,该软件包支持datetimetypes,它将接受任何可以parsing为date时间的东西。

例如

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

更多信息在这里 。

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

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

在你的控制器上:

 public ActionResult MyActionName(DateTime date) { } 

请记住将您的默认路线保留在RegisterRoutes方法的底部。 请注意,引擎会尝试将您在{date}中发送的任何值作为DateTime示例进行投射,因此如果无法投射,则会抛出exception。 如果您的datestring包含空格或:您可以HTML.Encode它们,使URL可以正确parsing。 如果否,那么你可以有另一个date时间表示。

拆分年,月,日和小时

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

使用级联的If语句来构build传递给Action的参数的date时间

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