我需要一个具有日期时间值的操作参数吗?有没有标准的方法来做到这一点?我需要有类似的东西:
mysite/Controller/Action/21-9-2009 10:20
但我只是通过以下方式成功地做到了:
mysite/Controller/Action/200909211020
并编写一个自定义函数来处理这种格式。
再次,寻找一种标准或认可的 ASP.net MVC 方法来执行此操作。
我需要一个具有日期时间值的操作参数吗?有没有标准的方法来做到这一点?我需要有类似的东西:
mysite/Controller/Action/21-9-2009 10:20
但我只是通过以下方式成功地做到了:
mysite/Controller/Action/200909211020
并编写一个自定义函数来处理这种格式。
再次,寻找一种标准或认可的 ASP.net MVC 方法来执行此操作。
第一个示例 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 对弗拉德的评论。
尝试使用 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);
}
使用刻度值。重建为 DateTime 结构非常简单
Int64 nTicks = DateTime.Now.Ticks;
....
DateTime dtTime = new DateTime(nTicks);
我想我会与任何寻求类似答案的人分享 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
它按应有的方式对日期和时间进行编码。
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 参数都可以映射到操作方法参数。
拆分年、月、日小时和分钟
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)
我意识到它在像这样添加斜线后起作用
mysite/Controller/Action/21-9-2009 10:20/
您应该首先在 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 表示。
我也有同样的问题。我使用 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 ;
}
我希望这个链接对你有帮助。