#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);