2009-08-17 17 views
10

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.

+1

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 –

+1

Ellos trabajan para mí. Use una herramienta HTTP como Fiddler o HttpWatch para ver si su publicación de AJAX está formada correctamente. –

+0

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. –

Respuesta

5

hacer una carpeta flotante modelo. Eso puede extraer el valor apropiado de la colección de formularios, analizarlo y devolverlo como argumento

0

EDITAR: ¿Necesita utilizar la publicación de jQuery? ¿Hay alguna manera de usar el soporte integrado para ajax para crear un enlace y cuál es el resultado en ese caso? p.ej.

Ajax.ActionLink("Link Name", "OpenTrade", "Home", 
        new { price = 1.5f }, 
        new AjaxOptions 
        { 
         OnSuccess = "success", 
         .... 
        }) 

Al especificar un valor flotante, generalmente tiene que fijar el valor con 'f', p. Ej.

float f = 1.5f; 

¿Has probado esto?

Una solución alternativa sería la de cambiar su método de servicio a:

[AcceptVerbs(HttpVerbs.Post)] 
public void OpenTrade(int dollars, int cents) 
+0

Ad 1. Recuerde, que tengo número dentro Javascript, no en el interior de código C#, por lo que añadir 'f' no ayudaría. Ad 2. Es una solución, pero es aún menos elegante que conseguir mi humilde opinión cadena (estoy ignorando el hecho de que estoy pasando el valor del dinero como el número de flotación, que casi nunca es una buena idea, pero en este caso, Sé lo que estoy haciendo) –

+0

Edición de anuncios. Prefiero tener toda la lógica implementada en JS, ya que no solo estoy poniendo pocos enlaces con las consultas ajax, además, no creo que el problema esté en el lado JS, que es simplemente pasar datos a MVC en un formato determinado. –

+0

Ad 1. Por supuesto, tonto de mí :) –

0

¿Ha comprobado para ver cuál es la respuesta JSON desde el servidor es?Me he dado cuenta que no ha encapsulado la variable de precio con comillas dobles, por lo que su mensaje al servidor se verá así:

{'price':1.5} 

No sé si eso va a ser un problema con un solo parámetro de datos, pero sospecha que lo que realmente quiere que se vea como es

"{'price':1.5}" 

métodos jQuery ajax ser pasado a métodos ASP.Net debe tener una cadena para el parámetro de datos de otro modo jQuery puede serializar los datos de forma incorrecta. Tener la cadena significa que jQuery dejará solo su objeto JSON y pasará toda la cadena a ASP.NET para analizar en el lado del servidor.

+0

no creo que este es el caso, cuando he hecho lo que me has aconsejado, todo lo que ha dejado de funcionar :), como si yo he tratado de pasar a alguna otra datos, que son cadenas - no fueron deserializados por mvc en absoluto. –

2
{ price: '1,5' } 

debería estar bien.

+0

He encontrado muchos problemas similares. Usar una cadena y convertirla nuevamente en el controlador es la manera más simple, a veces incluso la más elegante, de hacerlo funcionar. –

-2
UpdateImage(string rotationAngle) 
     { 
      double d; 
      double.TryParse(rotationAngle, System.Globalization.NumberStyles.Number, System.Globalization.CultureInfo.InvariantCulture, out d); 
+0

Formatee su código. –

Cuestiones relacionadas