route - ¿Cómo paso un valor de fecha y hora como un parámetro URI en asp.net mvc?
hiddenfor razor (8)
Desde MVC 5 puede usar el paquete de enrutamiento de atributos integrado que admite un tipo de datetime
y datetime
, que aceptará cualquier cosa que pueda ser analizada en un DateTime.
p.ej
[GET("Orders/{orderDate:datetime}")]
Más información here .
¿Necesito tener un parámetro de acción que tenga un valor de fecha y hora? ¿Hay una manera estándar de hacer esto? Necesito tener algo como:
mysite/Controller/Action/21-9-2009 10:20
pero solo estoy logrando hacerlo con algo como:
mysite/Controller/Action/200909211020
y escribiendo una función de custome para lidiar con este formato.
Nuevamente, en busca de una forma estándar o sancionada de ASP.net MVC para hacer esto.
Dividir el año, mes, día, horas y minutos.
routes.MapRoute(
"MyNewRoute",
"{controller}/{action}/{Year}/{Month}/{Days}/{Hours}/{Mins}",
new { controller="YourControllerName", action="YourActionName"}
);
Use una instrucción If en cascada para construir la fecha y hora a partir de los parámetros pasados a la acción
'' 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
(Disculpas por vb.net pero tienes la idea: P)
El formato típico de un URI para ASP .NET MVC es Controlador / Acción / Id donde Id es un número entero
Yo sugeriría enviar el valor de fecha como un parámetro en lugar de como parte de la ruta:
mysite/Controller/Action?date=21-9-2009 10:20
Si aún le está dando problemas, la fecha puede contener caracteres que no están permitidos en un URI y que necesitan ser codificados. Revisa:
encodeURIComponent(yourstring)
Es un método dentro de Javascript.
En el lado del servidor:
public ActionResult ActionName(string date)
{
DateTime mydate;
DateTime.Tryparse(date, out mydate);
}
Para su información, cualquier parámetro de URL se puede asignar a un parámetro de método de acción siempre y cuando los nombres sean los mismos.
Los dos puntos en la url de su primer ejemplo causarán un error (Solicitud incorrecta), por lo que no puede hacer exactamente lo que está buscando. Aparte de eso, el uso de un DateTime como un parámetro de acción es definitivamente posible.
Si está utilizando el enrutamiento predeterminado, esta tercera parte de su url de ejemplo recogerá el valor de DateTime como el parámetro {id}. Entonces tu método de acción podría verse así:
public ActionResult Index(DateTime? id)
{
return View();
}
Probablemente querrá usar un Datetime de Nullable como lo he hecho yo, así que si este parámetro no está incluido, no causará una excepción. Por supuesto, si no desea que se llame "id", agregue otra entrada de ruta reemplazando {id} con su nombre de elección.
Siempre que el texto en la url se analice a un valor de DateTime válido, esto es todo lo que tiene que hacer. Algo como lo siguiente funciona bien y será recogido en su método de Acción sin ningún error:
<%=Html.ActionLink("link", "Index", new { id = DateTime.Now.ToString("dd-MM-yyyy") }) %>
El problema, en este caso, por supuesto, es que no incluí el tiempo. No estoy seguro de que haya alguna forma de formatear una cadena de fecha (válida) con la hora no representada con dos puntos, por lo que si DEBE incluir la hora en la URL, es posible que deba usar su propio formato y analizar el resultado de nuevo en un DateTime manualmente. Digamos que reemplazamos el colon con un "!" en el enlace de acción: new { id = DateTime.Now.ToString("dd-MM-yyyy HH!mm") }
.
Su método de acción no podrá analizar esto como una fecha, por lo que la mejor apuesta en este caso probablemente lo acepte como una cadena:
public ActionResult Index(string id)
{
DateTime myDate;
if (!string.IsNullOrEmpty(id))
{
myDate = DateTime.Parse(id.Replace("!", ":"));
}
return View();
}
Edit: Como se señaló en los comentarios, hay algunas otras soluciones posiblemente mejores que las mías. Cuando escribí originalmente esta respuesta, creo que estaba tratando de preservar la esencia del formato de fecha y hora lo mejor posible, pero claramente la codificación URL sería una forma más adecuada de manejar esto. +1 al comentario de Vlad.
Pensé que compartiría lo que me funciona en MVC5 para cualquiera que venga en busca de una respuesta similar.
Mi firma de controlador se ve así:
public ActionResult Index(DateTime? EventDate, DateTime? EventTime)
{
}
Mi ActionLink se ve así en Razor:
@Url.Action("Index", "Book", new { EventDate = apptTime, EventTime = apptTime})
Esto da una URL como esta:
Book?EventDate=01%2F20%2F2016%2014%3A15%3A00&EventTime=01%2F20%2F2016%2014%3A15%3A00
Que codifica la fecha y la hora como debería.
Primero debe agregar una nueva ruta en global.asax:
routes.MapRoute(
"MyNewRoute",
"{controller}/{action}/{date}",
new { controller="YourControllerName", action="YourActionName", date = "" }
);
El en su controlador:
public ActionResult MyActionName(DateTime date)
{
}
Recuerde mantener su ruta predeterminada en la parte inferior del método RegisterRoutes. Tenga en cuenta que el motor intentará emitir el valor que envíe en {fecha} como un ejemplo de fecha y hora, por lo que si no puede emitirse, se lanzará una excepción. Si la cadena de fecha contiene espacios o: podría HTML.Ingredícelos para que la URL se pueda analizar correctamente. Si no, entonces podría tener otra representación de DateTime.
Trate de usar toISOString (). Devuelve cadena en formato ISO8601.
de javascript
$.get(''/example/doGet?date='' + new Date().toISOString(), function (result) {
console.log(result);
});
desde C#
[HttpGet]
public JsonResult DoGet(DateTime date)
{
return Json(date.ToString(), JsonRequestBehavior.AllowGet);
}
Utilice el valor de las garrapatas. Es bastante simple reconstruir en una estructura DateTime
Int64 nTicks = DateTime.Now.Ticks;
....
DateTime dtTime = new DateTime(nTicks);