net mvc multiple buttons asp asp.net-mvc-3 cultureinfo

asp.net-mvc-3 - asp - mvc multiple submit buttons



Pasar un DateTime al controlador a través de la URL que causa un error en ASP.NET MVC 3(cultura) (4)

Como alguien que trabaja mucho con compañías de EE. UU., Tengo mucha experiencia en temas relacionados con fechas.

Mi mejor consejo es elegir un formato no ambiguo al transmitir.

dd-MMM-yyyy

y

yyyy-MM-dd

Son apuestas seguras, y serán analizadas con éxito por DateTime.Parse (obj).

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

Mi aplicación está configurada con la cultura pt-BR (la fecha es dd-mm-aaaa) en web.config:

<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 el DateTime creado en mi sistema tiene el formato correcto, pero yo creé un método de controlador como ese:

public ActionResult Test(DateTime date) { }

Llamar a ese método directamente en el navegador pasa nulo cuando la fecha es con formato portugués-br, así:

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 arreglar eso, para aceptar mi formato de fecha?


Hay un gotcha con el cuaderno de modelos predeterminado que no es fácil de conocer pero una vez que lo sabes ya no cometes el mismo error:

  • Cuando usa una solicitud POST, la carpeta de modelos predeterminada usa su configuración de cultura para analizar las fechas.

  • Cuando utiliza una solicitud GET, el modelo de carpeta predeterminado utiliza CultureInfo.InvariantCulture para analizar las fechas e ignora su configuración de cultura actual.

Como está utilizando una solicitud GET y está pasando la fecha como un parámetro de cadena de consulta, debe formatearla utilizando el formato de cultura invariante cuando la envíe 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 la siguiente publicación del blog, que contiene más detalles.


Obtuve el mismo problema al usar una @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 })

Tenga en cuenta el new { } alrededor de la instancia de MyModel , de esta manera el DateTime no se convierte en 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.


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