Как передать значение даты и времени в качестве параметра URI в asp.net mvc?

Мне нужно иметь параметр действия, который имеет значение даты и времени? Есть ли стандартный способ сделать это? Мне нужно иметь что-то вроде:

mysite/Controller/Action/21-9-2009 10:20

но мне это удается только с чем-то вроде:

mysite/Controller/Action/200909211020

и написание пользовательской функции для работы с этим форматом.

Опять же, ищем стандартный или санкционированный ASP.net MVC способ сделать это.


person GilShalit    schedule 03.08.2009    source источник


Ответы (10)


Двоеточие в 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 к комментарию Влада.

person Kurt Schindler    schedule 03.08.2009
comment
Спасибо за исчерпывающий обзор. Мне нужно получить время как часть параметра, потому что это своего рода приложение маршрутизации, в котором поездки имеют желаемое время. Поэтому я думаю, что буду придерживаться своего собственного метода форматирования. - person GilShalit; 04.08.2009
comment
Вполне возможно передать значение даты И времени через строку запроса, не прибегая к хакам, таким как Replace(!, :). Вам просто нужно закодировать точки с запятой в URL — это можно сделать в Javascript с помощью метода encodeURIComponent. - person Vlad Iliescu; 16.09.2011
comment
Вы можете передать только дату, а затем передать целочисленное значение в качестве второго параметра, который составляет секунды/минуты от полуночи, а затем просто добавить их обратно в действие. - person Ben Robinson; 18.11.2011
comment
Спасибо за ваш ответ, я использовал этот тип :) - person Hovhannes Babayan; 22.10.2015

Попробуйте использовать 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);
}
person rnofenko    schedule 29.01.2015
comment
Это очень аккуратное решение - person Marcin Konrad Ceglarek; 14.07.2016
comment
Для меня это лучший подход, он дает вам стандартный способ сериализации объекта Date и при этом обеспечивает удобочитаемость для человека. Из С# вы можете использовать dateTimeObject.ToString(o) для сериализации в ISO8601. - person Gabriel Espinoza; 03.01.2018
comment
На мой взгляд, это лучший ответ. Не нужно возиться с анализом строк в действии контроллера и не возиться с конкатенацией строк для создания аргументов запроса. Чисто и стандартизировано. (...и работает!) - person Phil; 07.09.2018
comment
Вау, это превосходное стандартное решение, вместо передачи и формата даты метка времени лучше и стандартна. - person Anoop P S; 24.01.2020
comment
В моем случае это сработало, когда была передана только дата. Если параметр включает время, метод не найден. - person jstuardo; 09.04.2020

Используйте значение тиков. Довольно просто перестроиться в структуру DateTime

 Int64 nTicks = DateTime.Now.Ticks;
 ....
 DateTime dtTime = new DateTime(nTicks);
person Gordon Thompson    schedule 03.08.2009
comment
Это аккуратно. Что мне нравится в моем решении, так это то, что URI по-прежнему читаем. - person GilShalit; 03.08.2009

Я подумал, что поделюсь тем, что работает для меня в MVC5, для всех, кто ищет аналогичный ответ.

Моя подпись контроллера выглядит так:

public ActionResult Index(DateTime? EventDate, DateTime? EventTime)
{

}

Мой ActionLink выглядит в Razor так:

@Url.Action("Index", "Book", new { EventDate = apptTime, EventTime = apptTime})

Это дает такой URL-адрес:

Book?EventDate=01%2F20%2F2016%2014%3A15%3A00&EventTime=01%2F20%2F2016%2014%3A15%3A00

Который кодирует дату и время как следует.

person Sam Ellis    schedule 26.01.2016

Типичный формат 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-адреса может быть сопоставлен с параметром метода действия, если имена совпадают.

person Roland Schaer    schedule 03.08.2009

Разделите год, месяц, дневные часы и минуты

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)

person JonAlb    schedule 10.12.2012

Начиная с MVC 5, вы можете использовать встроенный пакет Attribute Routing, который поддерживает тип datetime, который будет принимать любые который можно разобрать на DateTime.

e.g.

[GET("Orders/{orderDate:datetime}")]

Дополнительная информация здесь.

person demoncodemonkey    schedule 04.02.2014

я понимаю, что это работает после добавления косой черты вот так

mysite/Controller/Action/21-9-2009 10:20/
person Angie Loo    schedule 19.12.2018

Сначала вы должны добавить новый маршрут в 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.

person Freddy    schedule 03.08.2009

У меня та же проблема. Я использую метод DateTime.Parse. и в URL-адресе используйте этот формат для передачи моего параметра DateTime 2018-08-18T07:22:16

для получения дополнительной информации об использовании метода DateTime Parse обратитесь к этой ссылке: Метод анализа DateTime

string StringDateToDateTime(string date)
    {
        DateTime dateFormat = DateTime.Parse(date);
        return dateFormat ;
    }

Я надеюсь, что эта ссылка поможет вам.

person Soroush Karimi    schedule 28.09.2020