2011-04-10 24 views
5

¿Cómo pasaría una fecha y hora, p. 01/01/2011 21:01:34 como una cadena de consulta?ASP.NET MVC Pase la fecha y hora como consulta

Estoy construyendo un sitio de reserva de teatro y durante la visualización de presentaciones Actualmente Paso el Show y lugar pero también tienen que pasar la fecha (ya que es la única parte de la actuación)

El ActionResult se ve así:

public ActionResult Details(String name, String venue, String date) 
{ 
    return View(_repository.performanceDetails(name, venue, date)); 
} 

Pero el performanceDate no funcionará porque es un tipo de datos de fecha y hora! Lo que debo hacer es eliminar la parte del tiempo de los datos, p. 00:00:00 y de alguna manera pasar el resto de datos como una cadena que puedo usar con el que comparar este modo:

public PerformanceDetails performanceDetails(String name, String venue, String date) 
{ 
    var PerformanceDetails = (from s in _db.PerformanceDetails 
           where s.show == name && 
            s.venue == venue && 
            s.performanceDate == date 
           select s).First(); 
    return PerformanceDetails; 
} 

Aquí hay un enlace de ejemplo:

<%= Html.ActionLink("View Details", "Details", "Performances", 
        new { 
         name = item.show, 
         venue = item.venue, 
         date = item.performanceDate }, 
        new {@class = "button"}) %> 

Respuesta

4

Trate de poner la fecha en la cadena de consulta en un formato algo como esto:

item.performanceDate.ToString("dd-MMM-yyyy") 

esto le dará una URL como (si no se está usando rutas):

http://foo/Performance/Details?name=someName&venue=someVenue&date=31-Mar-2011 

Esto es útil porque querrá evitar barras en su fecha en la cadena de consulta, y querrá ser explícito sobre la ubicación del mes/fecha (todo EE. UU. Y el Reino Unido). Sugiera usar números para la fecha y caracteres alfabéticos para el mes.

En su ActionMethod, puede simplemente TryParse() o el valor entrante.

var dt = DateTime.Parse(date); 

En su consulta LINQ se puede hacer algo como esto:

&& s.performanceDate == dt 

Así que para poner todo junto:

public ActionResult Details(String name, String venue, String date) 
{ 
    DateTime dt; 

    if (DateTime.TryParse(date, out dt)) 
    { 
     return View(_repository.performanceDetails(name, venue, dt));  
    } 
    else 
    { 
     return View("Error", "The value passed in date isn't a date value."); 
    } 
} 

public PerformanceDetails performanceDetails(String name, String venue, DateTime dt) 
{ 
    var PerformanceDetails = (from s in _db.PerformanceDetails 
           where s.show == name && 
            s.venue == venue && 
            s.performanceDate == dt.Date     
           select s).First(); 
    return PerformanceDetails; 

} 

<%= Html.ActionLink("View Details", "Details", "Performances", 
       new { name = item.show , 
         venue = item.venue, 
         date = item.performanceDate.ToString("dd-MMM-yyyy") }, 
       new {@class = "button"}) %> 
+0

Soy ** NOT ** urls de enrutamiento, así que actualmente tengo direcciones URL como '/? Name = Macbeth & venue = Playhouse & date = 02/01/2011' – Cameron

+0

@p.Campbell Lo siento, estoy un poco confundido (bastante tarde aquí en el Reino Unido también) con la posibilidad de que puedas editar mis tres códigos con tu idea para que pueda ver completamente lo que quieres decir. Creo que sí, pero estoy preocupado por explotar mi aplicación. ** ¡MUCHÍSIMO APRECIADO! ** – Cameron

+0

Aparece el siguiente error: 'El miembro de tipo especificado 'Fecha' no es compatible con LINQ to Entities. Solo los inicializadores, los miembros de la entidad y las propiedades de navegación de la entidad son compatibles. "Y explota en mi repositorio (así que el segundo fragmento de código) cualquier idea sobre cuál es el problema y cómo solucionarlo. Gracias – Cameron

2

Hay varias maneras de hacer esto. Una forma es la forma en que sugiere Cameron. Otra forma sería convertir la fecha en un número numérico, como tics, luego pasar este valor numérico en su URL y convertirlo nuevamente en su método de Acción.

Int64 ticks = dateOfShow.Ticks; 

DateTime newDateOfShow = new DateTime(ticks); 
5

En primer lugar, el argumento para su método de acción debe ser un tipo DateTime, no una cadena. Debe asegurarse de que su argumento de cadena de consulta tenga el formato ISO 8601 Formato extendido (http://en.wikipedia.org/wiki/ISO_8601), por ejemplo: 2011-10-17T12: 35: 00.

El encuadernador predeterminado convertirá esa cadena a una fecha sin ningún problema. Descubrí que necesita dos dígitos cada uno para hh: mm: ss, es decir, usa ceros a la izquierda para números debajo de diez. Sin embargo, puede omitir los milisegundos y el especificador de zona horaria 'Z'.

Ahora que tiene una fecha y hora completas, simplemente puede usar la parte de fecha para las búsquedas en la base de datos usando mydate.Date.

Cuestiones relacionadas