Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: GilShalitОтветов: 10

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

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

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

mysite/Controller/Action/200909211020

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

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

uridatetime

Ответы

Ответ 1 · рейтинг 41 · Kurt Schindler

Двоеточие в 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})

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

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

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

Ответ 5 · рейтинг 5 · Roland Schaer

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы