ASP.NET MVC передает datetime как запрос

#asp.net-mvc

#asp.net-mvc

Вопрос:

Как бы я передал datetime, например, 01/01/2011 21:01:34 в виде строки запроса?

Я создаю сайт бронирования билетов в театр, и при просмотре спектаклей я в настоящее время передаю шоу и место проведения, но также необходимо указать дату (поскольку это уникальная часть представления)

Результат ActionResult выглядит следующим образом:

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

Но performanceDate не будет работать, потому что это тип данных datetime! Что мне нужно сделать, это УДАЛИТЬ временную часть данных, например, 00:00:00 и каким-то образом передать оставшиеся данные в виде строки, которую я могу использовать для сравнения примерно так:

 public PerformanceDetails performanceDetails(String name, String venue, String date)
{
    var PerformanceDetails = (from s in _db.PerformanceDetails
                              where s.show == name amp;amp; 
                                    s.venue == venue amp;amp; 
                                    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"}) %>
  

Ответ №1:

Во-первых, аргументом вашего метода Action должен быть тип DateTime, а не строка. Вы должны убедиться, что ваш аргумент строки запроса отформатирован с использованием расширенного формата ISO 8601 (http://en.wikipedia.org/wiki/ISO_8601 ), например: 2011-10-17T12:35:00.

Связующее по умолчанию преобразует эту строку в дату без каких-либо проблем. Я обнаружил, что для hh: mm: ss вам нужны две цифры для каждой, то есть используйте начальные нули для чисел меньше десяти. Однако вы можете опустить миллисекунды и спецификатор часового пояса ‘Z’.

Теперь, когда у вас есть полная дата и время, вы можете просто использовать часть date для поиска в базе данных, используя mydate.Date.

Ответ №2:

Попробуйте поместить вашу дату в строку запроса в формате, подобном этому:

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

Это даст вам URL, подобный (если вы не используете маршруты):

 http://foo/Performance/Details?name=someNameamp;venue=someVenueamp;date=31-Mar-2011
  

Это полезно, потому что вы захотите избежать косых черт в вашей дате в строке запроса, и вы захотите четко указывать месяц / дату размещения (для всех США и Великобритании). Предлагаю использовать числа для даты и альфа-символы для месяца.

Затем в вашем ActionMethod вы можете просто TryParse() или Parse() входящее значение.

 var dt = DateTime.Parse(date);
  

В вашем запросе LINQ вы можете сделать что-то вроде этого:

 amp;amp; 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 amp;amp; 
                                    s.venue == venue amp;amp; 
                                   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"}) %>
  

Комментарии:

1. Я не маршрутизирую URL-адреса, поэтому в настоящее время у меня есть URL-адреса типа /?name=Macbethamp;venue=Playhouseamp;date=02/01/2011

2. @p.campbell Извините, я немного запутался (здесь, в Великобритании, тоже довольно поздно), есть ли шанс, что вы могли бы отредактировать мои три фрагмента кода в соответствии со своей идеей, чтобы я мог полностью понять, что вы имеете в виду. Я думаю, что да, но я беспокоюсь о том, чтобы взорвать мое приложение. ОЧЕНЬ ПРИЗНАТЕЛЕН!

3. Я получаю следующую ошибку: The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported. и она взрывается в моем репозитории (итак, второй фрагмент кода) есть идеи, в чем проблема и как ее исправить? Спасибо

4. это MDF в папке App_Data, это datetime, и оно НЕ обнуляется. Спасибо

5. Получите эту ошибку сейчас: LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression.

Ответ №3:

Это можно сделать несколькими способами. Один из способов — это способ, предложенный Кэмероном. Другим способом было бы преобразовать дату в числовое значение, такое как тики, затем передать это числовое значение в вашем URL и преобразовать его обратно в вашем методе Action.

 Int64 ticks = dateOfShow.Ticks;

DateTime newDateOfShow = new DateTime(ticks);