如何在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开始,您可以使用内置的属性路由软件包,该软件包支持datetime
types,它将接受任何可以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)