Как передать значение datetime в качестве параметра URI в asp.net mvc?
Мне нужно иметь параметр действия, который имеет значение datetime? Есть ли стандартный способ сделать это? Мне нужно что-то вроде:
mysite/Controller/Action/21-9-2009 10:20
но я преуспеваю только в этом:
mysite/Controller/Action/200909211020
и написать функцию custome для работы с этим форматом.
Опять же, поиск стандартного или санкционированного способа ASP.net MVC для этого.
Ответы
Ответ 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/