Как передать значение datetime в качестве параметра URI в asp.net mvc? - PullRequest
56 голосов
/ 03 августа 2009

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

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

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

mysite/Controller/Action/200909211020

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

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

Ответы [ 9 ]

36 голосов
/ 04 августа 2009

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

28 голосов
/ 29 января 2015

Попробуйте использовать toISOString (). Возвращает строку в формате ISO8601.

из JavaScript

$.get('/example/doGet?date=' + new Date().toISOString(), function (result) {
    console.log(result);
});

от c #

[HttpGet]
public JsonResult DoGet(DateTime date)
{
    return Json(date.ToString(), JsonRequestBehavior.AllowGet);
}
13 голосов
/ 03 августа 2009

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

 Int64 nTicks = DateTime.Now.Ticks;
 ....
 DateTime dtTime = new DateTime(nTicks);
5 голосов
/ 26 января 2016

Я думал, что поделюсь тем, что работает для меня в 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

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

5 голосов
/ 04 августа 2009

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

1 голос
/ 04 февраля 2014

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

например.

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

Подробнее здесь .

0 голосов
/ 19 декабря 2018

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

mysite/Controller/Action/21-9-2009 10:20/
0 голосов
/ 11 декабря 2012

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

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)

0 голосов
/ 03 августа 2009

Сначала вы должны добавить новый маршрут в global.asax:


routes.MapRoute(
                "MyNewRoute",
                "{controller}/{action}/{date}",
                new { controller="YourControllerName", action="YourActionName", date = "" }
            );

На вашем контроллере:



        public ActionResult MyActionName(DateTime date)
        {

        }

Не забудьте сохранить маршрут по умолчанию в нижней части метода RegisterRoutes. Имейте в виду, что движок попытается привести любое значение, которое вы отправите в {date} в качестве примера DateTime, поэтому, если оно не может быть приведено, то будет выдано исключение. Если ваша строка даты содержит пробелы или: вы можете HTML.Кодировать их, чтобы URL мог быть проанализирован правильно. Если нет, то у вас может быть другое представление DateTime.

...