Asp.net-MVC ahora permite la vinculación implícita de objetos DateTime. Tengo una acción en la línea de
public ActionResult DoSomething(DateTime startDate)
{
...
}
Esto convierte con éxito una cadena de una llamada ajax en DateTime. Sin embargo, usamos el formato de fecha dd / MM / aaaa; MVC se está convirtiendo a MM / dd / aaaa. Por ejemplo, enviar una llamada a la acción con una cadena '09 / 02/2009 'da como resultado una fecha y hora de '02 / 09/2009 00:00:00', o el 2 de septiembre en nuestra configuración local.
No quiero rodar mi propio modelo de carpeta por el bien de un formato de fecha. Pero parece innecesario tener que cambiar la acción para aceptar una cadena y luego usar DateTime.Parse si MVC es capaz de hacer esto por mí.
¿Hay alguna forma de alterar el formato de fecha utilizado en la carpeta del modelo predeterminado para DateTime? ¿No debería el archivador de modelo predeterminado usar la configuración de localización de todos modos?
fuente
Respuestas:
Acabo de encontrar la respuesta a esto con un google más exhaustivo:
Melvyn Harbour tiene una explicación detallada de por qué MVC trabaja con las fechas de la manera en que lo hace, y cómo puede anular esto si es necesario:
http://weblogs.asp.net/melvynharbour/archive/2008/11/21/mvc-modelbinder-and-localization.aspx
fuente
MM/dd/yyyy
formato, de lo contrario, muestra un error de validaciónThe field BeginDate must be a date.
, ¿cómo puedo hacer que el servidor acepte eldd/MM/yyyy
formato?Globalmente establecería sus culturas. ¡ModelBinder lo recoge!
O simplemente cambia esto para esta página.
Pero globalmente en web.config creo que es mejor
fuente
He estado teniendo el mismo problema con el formato de fecha corta vinculante a las propiedades del modelo DateTime. Después de mirar muchos ejemplos diferentes (no solo con respecto a DateTime), reuní lo siguiente:
Para mantener la forma en que las rutas, etc., se registran en el archivo ASAX global, también agregué una nueva clase sintética a la carpeta App_Start de mi proyecto MVC4 llamada CustomModelBinderConfig:
Entonces simplemente llamo al static RegisterCustomModelBinders estático desde mi Global ASASX Application_Start de esta manera:
Una nota importante aquí es que si escribe un valor DateTime en un campo oculto como este:
Lo hice y el valor real en la página estaba en el formato "MM / dd / aaaa hh: mm: ss tt" en lugar de "dd / MM / aaaa hh: mm: ss tt" como quería. Esto hizo que la validación de mi modelo fallara o devolviera la fecha incorrecta (obviamente intercambiando los valores de día y mes).
Después de un montón de rascarse la cabeza e intentos fallidos, la solución fue establecer la información cultural para cada solicitud haciendo esto en Global.ASAX:
No funcionará si lo pega en Application_Start o incluso Session_Start, ya que eso lo asigna al hilo actual de la sesión. Como bien sabe, las aplicaciones web no tienen estado, por lo que el hilo que atendió su solicitud anteriormente no es el mismo hilo que atiende su solicitud actual, por lo tanto, su información cultural se ha ido al gran GC en el cielo digital.
Gracias a: Ivan Zlatev - http://ivanz.com/2010/11/03/custom-model-binding-using-imodelbinder-in-asp-net-mvc-two-gotchas/
garik - https://stackoverflow.com/a/2468447/578208
Dmitry - https://stackoverflow.com/a/11903896/578208
fuente
Va a ser un poco diferente en MVC 3.
Supongamos que tenemos un controlador y una vista con el método Get
Deberíamos agregar ModelBinder
y el comando en Application_Start () de Global.asax
fuente
IModelBinder
, particularmente con respecto a la validación. Además, solo funciona si el nombre deDateTime
es dateTime .DateTime?
solo funciona si agrega otra llamada aModelBinders.Binders.Add
withtypeof(DateTime?)
.También vale la pena señalar que, incluso sin crear su propio modelo de carpeta, se pueden analizar múltiples formatos diferentes.
Por ejemplo, en los Estados Unidos, todas las siguientes cadenas son equivalentes y se vinculan automáticamente al mismo valor de DateTime:
Recomiendo encarecidamente usar aaaa-mm-dd porque es mucho más portátil. Realmente no desea lidiar con el manejo de múltiples formatos localizados. Si alguien reserva un vuelo el 1 de mayo en lugar del 5 de enero, ¡tendrá grandes problemas!
NB: No estoy muy claro si aaaa-mm-dd se analiza universalmente en todas las culturas, por lo que tal vez alguien que sepa pueda agregar un comentario.
fuente
Intenta usar toISOString (). Devuelve una cadena en formato ISO8601.
Método GET
javascript
C#
Método POST
javascript
C#
fuente
Configuré la siguiente configuración en mi MVC4 y funciona de maravilla
fuente
fuente
fuente
Configuré
CurrentCulture
yCurrentUICulture
mi controlador base personalizadofuente