Двоеточие в URL-адресе вашего первого примера вызовет ошибку (неверный запрос), поэтому вы не сможете сделать именно то, что ищете. Кроме этого, использование DateTime в качестве параметра действия вполне возможно.
Если вы используете маршрутизацию по умолчанию, эта третья часть вашего примерного URL-адреса получит значение DateTime в качестве параметра {id}. Таким образом, ваш метод 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") }) %>
Загвоздка в данном случае, конечно, в том, что я не учел время. Я не уверен, что есть какие-либо способы отформатировать (действительную) строку даты со временем, не представленным двоеточиями, поэтому, если вы ДОЛЖНЫ включить время в URL-адрес, вам может потребоваться использовать свой собственный формат и проанализировать результат обратно в DateTime вручную. Допустим, мы заменили двоеточие на "!" в ссылке действия: 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-адресов было бы более правильным способом справиться с этим. +1 к комментарию Влада.
Ответ 2 · рейтинг 38 · rnofenko
Попробуйте использовать toISOString(). Возвращает строку в формате ISO8601.
из JavaScript
$.get('/example/doGet?date=' + new Date().toISOString(), function (result) {
console.log(result);
});
из С#
[HttpGet]
public JsonResult DoGet(DateTime date)
{
return Json(date.ToString(), JsonRequestBehavior.AllowGet);
}
Ответ 3 · рейтинг 18 · Gordon Thompson
Используйте значение тиков. Довольно просто перестроиться в структуру DateTime
Int64 nTicks = DateTime.Now.Ticks;
....
DateTime dtTime = new DateTime(nTicks);
Ответ 4 · рейтинг 6 · Sam Ellis
Я подумал, что поделюсь тем, что работает для меня в MVC5, для всех, кто ищет аналогичный ответ.
Моя подпись контроллера выглядит так:
public ActionResult Index(DateTime? EventDate, DateTime? EventTime)
{
}
Мой ActionLink выглядит в Razor так:
@Url.Action("Index", "Book", new { EventDate = apptTime, EventTime = apptTime})
Типичный формат URI для ASP .NET MVC - Controller/Action/Id, где Id - целое число.
Я бы предложил отправить значение даты как параметр, а не как часть маршрута:
mysite/Controller/Action?date=21-9-2009 10:20
Если это все еще вызывает у вас проблемы, дата может содержать символы, которые не разрешены в URI и должны быть закодированы. Проверить:
encodeURIComponent(yourstring)
Это метод в Javascript.
На стороне сервера:
public ActionResult ActionName(string date)
{
DateTime mydate;
DateTime.Tryparse(date, out mydate);
}
К вашему сведению, любой параметр URL-адреса может быть сопоставлен с параметром метода действия, если имена совпадают.
Ответ 6 · рейтинг 1 · JonAlb
Разделите год, месяц, дневные часы и минуты
routes.MapRoute(
"MyNewRoute",
"{controller}/{action}/{Year}/{Month}/{Days}/{Hours}/{Mins}",
new { controller="YourControllerName", action="YourActionName"}
);
Используйте каскадный оператор If для создания даты и времени из параметров, переданных в действие.
' Build up the date from the passed url or use the current date
Dim tCurrentDate As DateTime = Nothing
If Year.HasValue Then
If Month.HasValue Then
If Day.HasValue Then
tCurrentDate = New Date(Year, Month, Day)
Else
tCurrentDate = New Date(Year, Month, 1)
End If
Else
tCurrentDate = New Date(Year, 1, 1)
End If
Else
tCurrentDate = StartOfThisWeek(Date.Now)
End If
(Извините за vb.net, но вы поняли: P)
Ответ 7 · рейтинг 1 · demoncodemonkey
Начиная с MVC 5, вы можете использовать встроенный пакет Attribute Routing, который поддерживает тип datetime, который будет принимать любые который можно разобрать на DateTime.
e.g.
[GET("Orders/{orderDate:datetime}")]
Дополнительная информация здесь.
Ответ 8 · рейтинг 1 · Angie Loo
я понимаю, что это работает после добавления косой черты вот так
mysite/Controller/Action/21-9-2009 10:20/
Ответ 9 · Freddy
Сначала вы должны добавить новый маршрут в global.asax:
routes.MapRoute(
"MyNewRoute",
"{controller}/{action}/{date}",
new { controller="YourControllerName", action="YourActionName", date = "" }
);
На вашем контроллере:
public ActionResult MyActionName(DateTime date)
{
}
Не забудьте сохранить маршрут по умолчанию в нижней части метода RegisterRoutes. Имейте в виду, что движок попытается преобразовать любое значение, которое вы отправляете в {date}, в качестве примера DateTime, поэтому, если оно не может быть преобразовано, будет выдано исключение. Если ваша строка даты содержит пробелы или: вы можете HTML.Encode их, чтобы URL-адрес мог быть правильно проанализирован. Если нет, то у вас может быть другое представление DateTime.
Ответ 10 · Soroush Karimi
У меня та же проблема. Я использую метод DateTime.Parse. и в URL-адресе используйте этот формат для передачи моего параметра DateTime 2018-08-18T07:22:16
для получения дополнительной информации об использовании метода DateTime Parse обратитесь к этой ссылке: Метод анализа DateTime