2012-01-18 45 views
19

mi solicitud es setted con la cultura pt-BR (Fecha es dd-mm-aaaa) en web.config:Pasar un DateTime al controlador a través de URL que causa error en ASP .NET MVC 3 (de cultivo)

<globalization enableClientBasedCulture="false" requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="iso-8859-15" responseHeaderEncoding="utf-8" resourceProviderFactoryType="string" enableBestFitResponseEncoding="true" culture="pt-BR" uiCulture="pt-BR" /> 

Todo DateTime creado en mi sistema está en el formato correcto, pero creó un método controlador de esa manera:

public ActionResult Test(DateTime date) 
{ 
} 

Llamando que el método directo en el navegador está pasando nula cuando la fecha es con el formato portugués-BR, al igual que :

mysite/Test/?date=19/01/2012 => date = null in my controller 

mysite/Test/?date=01/01/2012 => date is fine, but in US format (mm-dd-yyyy) 

¿Cómo puedo solucionar eso, aceptar mi formato de fecha?

Respuesta

51

Hay una Gotcha con el modelo por defecto ligante que no es fácil saber acerca pero una vez que se sabe que ya no cometer el mismo error:

  • Cuando se utiliza una solicitud POST, el modelo por defecto ligante usa su configuración de cultura para analizar las fechas.

  • Cuando utiliza una solicitud GET, la carpeta de modelo predeterminada usa CultureInfo.InvariantCulture para analizar las fechas e ignora su configuración cultural actual.

Puesto que usted está utilizando una petición GET y pasando la fecha como un parámetro de cadena de consulta, se debe formatear utilizando el formato de referencia cultural de todos cuando se envía en la url. La forma correcta de formatear su fecha como un parámetro de cadena de consulta es yyyy-MM-dd.

Puede echar un vistazo a following blog post, que entra en más detalles.

+1

Si implementa el cuaderno personalizado, asegúrese de registrarlo para DateTime? también, no solo DateTime. – Justin

+0

Hola, Darin. Me encontré con el mismo problema que la publicación original y su respuesta y el artículo citado me ayudaron a comprender el problema, pero aún no puedo encontrar una respuesta. Estoy trabajando en ASP.NET Core 2.0 pero no sé cómo aplicar las recomendaciones del artículo. Espero que puedas echarle un vistazo a esta pregunta: https://stackoverflow.com/questions/47442368/routing-datetime-parameter-passing-as-null-empty –

2

Un enfoque sería aceptar la fecha como una cadena y luego manipularla en el controlador a la ubicación/cultura correctas.

8

Como alguien que trabaja mucho con empresas estadounidenses, he tenido mucha experiencia con cuestiones de fechas.

Mi mejor consejo es elegir un formato inequívoco al transmitir.

dd-MMM-yyyy 

y

yyyy-MM-dd 

son apuestas seguras, y será analizado con éxito por DateTime.Parse (obj).

Si cambiar el formato de fecha no es una opción, debe consultar DateTime.ParseExact, que le permite especificar la cadena de formato exacta que está buscando.

0

Tiene el mismo problema al usar un @Html.Action(..) en una vista.Para esta situación se puede resolver poniendo el DateTime en un modelo:

public class MyModel 
{ 
    public DateTime Value {get;set;} 
} 

y en la vista:

@Html.Action("MyAction", new { myModel }) 

Nota del new { } alrededor de la instancia de MyModel, de esta manera el DateTime No se convierte a una cadena. Esta solución solo funciona para Html.Action() y no para Html.ActionLink() o Url.Action() ya que MVC está haciendo un myModel.ToString() en la URL.

Cuestiones relacionadas