ASP.NET MVC将datetime作为查询传递

时间:2011-04-10 22:19:27

标签: asp.net-mvc

我如何通过日期时间,例如01/01/2011 21:01:34作为查询字符串?

我正在建立剧院预订网站,在观看表演时,我目前通过了演出和场地,但也需要通过日期(因为这是演出的独特部分)

ActionResult看起来像这样:

public ActionResult Details(String name, String venue, String date)
{
    return View(_repository.performanceDetails(name, venue, date));
}

但是performanceDate不会起作用,因为它是一个日期时间数据类型!我需要做的是删除数据的时间部分,例如00:00:00并以某种方式将剩余数据作为字符串传递,我可以用它来比较,如下所示:

public PerformanceDetails performanceDetails(String name, String venue, String date)
{
    var PerformanceDetails = (from s in _db.PerformanceDetails
                              where s.show == name && 
                                    s.venue == venue && 
                                    s.performanceDate == date
                              select s).First();
    return PerformanceDetails;
}

以下是一个示例链接:

<%= Html.ActionLink("View Details", "Details", "Performances", 
                    new { 
                        name = item.show, 
                        venue = item.venue, 
                        date = item.performanceDate }, 
                    new {@class = "button"}) %>

3 个答案:

答案 0 :(得分:6)

首先,Action方法的参数应该是DateTime类型,而不是字符串。您应确保使用ISO 8601扩展格式(http://en.wikipedia.org/wiki/ISO_8601)格式化查询字符串参数,例如:2011-10-17T12:35:00。

默认活页夹会将该字符串转换为没有任何问题的日期。我发现你需要两个数字用于hh:mm:ss,也就是说,对于10以下的数字使用前导零。您可以省略毫秒数和时区“Z”说明符。

既然您有完整的日期和时间,您只需使用日期部分使用mydate.Date进行数据库查找。

答案 1 :(得分:4)

尝试使用以下格式将日期放在查询字符串上:

item.performanceDate.ToString("dd-MMM-yyyy")

这将为您提供一个URL(如果您没有使用路线):

http://foo/Performance/Details?name=someName&venue=someVenue&date=31-Mar-2011

这很有用,因为您希望避免在查询字符串中显示日期中的斜杠,并且您希望明确说明月份/日期位置(整个美国和英国)。建议使用日期数字和月份字母字符。

在ActionMethod中,您可以简单地TryParse()Parse()传入的值。

var dt = DateTime.Parse(date);

在您的LINQ查询中,您可以执行以下操作:

&& s.performanceDate == dt 

所以要把它们放在一起:

public ActionResult Details(String name, String venue, String date)
{
    DateTime dt;

    if (DateTime.TryParse(date, out dt))
    {
        return View(_repository.performanceDetails(name, venue, dt));    
    }
    else
    {
        return View("Error", "The value passed in date isn't a date value.");
    }
}

public PerformanceDetails performanceDetails(String name, String venue, DateTime dt)
{
    var PerformanceDetails = (from s in _db.PerformanceDetails
                              where s.show == name && 
                                    s.venue == venue && 
                                   s.performanceDate == dt.Date                  
                              select s).First();
    return PerformanceDetails;

}

<%= Html.ActionLink("View Details", "Details", "Performances", 
                new { name = item.show , 
                      venue = item.venue, 
                      date = item.performanceDate.ToString("dd-MMM-yyyy") }, 
                new {@class = "button"}) %>

答案 2 :(得分:2)

有几种方法可以做到这一点。一种方式是Cameron建议的方式。另一种方法是将日期转换为数字,例如刻度,然后在URL上传递此数值并将其转换回Action方法。

Int64 ticks = dateOfShow.Ticks;

DateTime newDateOfShow = new DateTime(ticks);