Подтвердить что ты не робот

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

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

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

но я преуспеваю только в этом:

mysite/Controller/Action/200909211020

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

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

4b9b3361

Ответ 1

Двоеточие в вашем первом примере url приведет к ошибке (Bad Request), чтобы вы не могли точно выполнить то, что искали. Помимо этого, использование параметра DateTime в качестве параметра действия наиболее определенно возможно.

Если вы используете маршрутизацию по умолчанию, эта 3-я часть вашего примера 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 вручную. Скажем, мы заменяем двоеточие "!" в actionlink: 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

Попробуйте использовать 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

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

 Int64 nTicks = DateTime.Now.Ticks;
 ....
 DateTime dtTime = new DateTime(nTicks);

Ответ 4

Типичный формат 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);
}

FYI, любой параметр url может быть сопоставлен с параметром метода действия, если имена совпадают.

Ответ 5

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

Подпись My Controller выглядит следующим образом:

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

}

My 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

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

Ответ 6

Поскольку MVC 5 вы можете использовать встроенный Атрибут маршрутизации, который поддерживает тип datetime, который будет принимать все, что может быть проанализировано на DateTime.

например.

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

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

Ответ 7

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

Ответ 8

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

routes.MapRoute(
            "MyNewRoute",
            "{controller}/{action}/{Year}/{Month}/{Days}/{Hours}/{Mins}",
            new { controller="YourControllerName", action="YourActionName"}
        );

Используйте каскадное утверждение If для создания даты и времени из параметров, переданных в Action

    ' 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)

Ответ 9

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

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