Estoy trabajando con MVC recientemente y me he encontrado con un problema extraño al intentar enviar una solicitud a mi controlador usando ajax. Estoy usando jQuery (versión 1.3.2) que vino directamente con MVC, estoy tratando de enviar dicha solicitud ajax:JQuery + Asp.Net MVC, pasando el número de flotador
$.post("Home/OpenTrade", { price: 1.5 }, function() { }, "json");
También he intentado parseFloat("1.5")
en lugar de 1.5
.
Cuando intento para recibir este valor en el controlador usando
[AcceptVerbs(HttpVerbs.Post)]
public void OpenTrade(float? price)
Mi precio es siempre nula. Si omito ?
el controlador no se llama en absoluto (lo cual no es nada sorprendente), he intentado usar decimal
y double
tipo. Además, esta función funciona cuando estoy enviando datos enteros (si envío 1
se llama a este controlador, y float? price
se llena correctamente). ¿Me estoy perdiendo algo, o es un error?
Ad. Puedo recibir el precio como una cadena, y luego analizarlo manualmente, pero no me gusta esta solución, ya que no es elegante y combate el objetivo de usar framework como MVC para hacer esto por mí.
Editar & Respuesta: Consejo de utilización de Joel, he creado una carpeta de modelo, que voy a publicar, tal vez alguien va a usar:
class DoubleModelBinder : IModelBinder
{
#region IModelBinder Members
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
string numStr = bindingContext.ValueProvider[bindingContext.ModelName].AttemptedValue;
double res;
if (!double.TryParse(numStr, System.Globalization.NumberStyles.Number, System.Globalization.CultureInfo.InvariantCulture, out res))
{
if (bindingContext.ModelType == typeof(double?))
return null;
throw new ArgumentException();
}
if (bindingContext.ModelType == typeof(double?))
return new Nullable<double>(res);
else
return res;
}
#endregion
}
Puede ser registrado como dobles y dobles? carpeta, para el doble? pasará nulo al controlador, si el valor no se pudo haber resuelto.
BTW. ¿Alguna idea de por qué las carrozas y los dobles no funcionan de la caja (para mí?)?
Edit2 & Solución: Bien, esto va a ser divertido :). No funcionó para mí, porque la cadena solicitada enviaba 1.5432
(un valor de ejemplo), lo cual está perfectamente bien, pero ... MVC intentaba decodificarlo internamente usando mi configuración cultural, que esperan que los números estén en el formato 1 , 5432, por lo que la conversión ha fallado silenciosamente.
Por lo tanto, una cosa para recordar: si vive en un país extraño, vuelva a verificar su configuración cultural.
Me trataron de sujeción juntos una aplicación de prueba para ver si podía volver a crear el problema original (cut'n'pasted tanto su llamada jQuery y la firma acción) pero todo funciona bien para mí. El parámetro flotante siempre tiene el valor. .... extraño eh –
Ellos trabajan para mí. Use una herramienta HTTP como Fiddler o HttpWatch para ver si su publicación de AJAX está formada correctamente. –
eso es extraño ... voy a echar un vistazo más de cerca en esto que, tal vez voy a descubrir lo que está mal. –