如何在ASP.NETMVC中将日期时间值作为URI参数传递?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (48)

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

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

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

mysite/Controller/Action/200909211020

并编写一个custome函数来处理这种格式。

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

提问于
用户回答回答于

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

如果使用的是默认路由,则示例网址的第三部分将以{id}参数获取DateTime值。所以你的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") }) %>

这种情况当然是,我没有包括时间。我不确定有什么方法可以格式化(有效的)日期字符串而不用冒号表示时间,所以如果必须在网址中包含时间,则可能需要使用自己的格式并将结果解析回一个DateTime手动。假设我们用“!”代替冒号 在actionlink中: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编码是处理这种问题的更合适的方式。

用户回答回答于

尝试使用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);
}

扫码关注云+社区