ASP.NET MVC Pass datetime as query

2020-07-10 08:07发布

How would I pass a datetime e.g. 01/01/2011 21:01:34 as a query string?

I am building a theatre booking site and when viewing performances I currently pass the Show and Venue but also need to pass the date (as this is the unique part of the performance)

The ActionResult looks like so:

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

But the performanceDate wont work because it's a datetime data type! What I need to do is REMOVE the time part of the data e.g. 00:00:00 and somehow pass the remaining data as a string that I can use to compare against like so:

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

Here is a sample link:

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

标签: asp.net-mvc
3条回答
家丑人穷心不美
2楼-- · 2020-07-10 08:10

Firstly, the argument to your Action method should be a DateTime type, not a string. You should make sure that your query string argument is formatted using ISO 8601 Extended Format (http://en.wikipedia.org/wiki/ISO_8601), for example: 2011-10-17T12:35:00.

The default binder will convert that string to a date without any problem. I found that you need two digits each for hh:mm:ss, that is, use leading zeros for numbers below ten. You can omit the milliseconds though, and the time zone 'Z' specifier.

Now that you have a full date and time, you can simply use the date portion for database lookups using mydate.Date.

查看更多
贪生不怕死
3楼-- · 2020-07-10 08:14

Try putting your date on the querystring in a format something like this:

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

This will give you a URL like (if you're not using routes):

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

This is helpful because you'll want to avoid slashes in your date on the querystring, and you'll want to be explicit about month/date placement (the whole US and UK). Suggest using numbers for date, and alpha characters for month.

In your ActionMethod, you can then simply TryParse() or Parse() the incoming value.

var dt = DateTime.Parse(date);

In your LINQ query you can do something like this:

&& s.performanceDate == dt 

So to put it all together:

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"}) %>
查看更多
走好不送
4楼-- · 2020-07-10 08:23

There are several ways you can do this. One way is the way Cameron suggests. Another way would be to convert the date to a numeric number, such as ticks, then pass this numeric value on your URL and convert it back in your Action method.

Int64 ticks = dateOfShow.Ticks;

DateTime newDateOfShow = new DateTime(ticks);
查看更多
登录 后发表回答