2009-08-17 8 views
10

Ultimamente sto lavorando con MVC e ho riscontrato uno strano problema durante il tentativo di inviare una richiesta al mio controller usando ajax. Sto utilizzando jQuery (versione 1.3.2) che è venuto direttamente con MVC, sto cercando di inviare tale richiesta ajax:JQuery + Asp.Net MVC, numero float passante

$.post("Home/OpenTrade", { price: 1.5 }, function() { }, "json"); 

Ho anche provato parseFloat("1.5") invece di 1.5.
Quando provo a ricevere questo valore nel controller utilizzando

[AcceptVerbs(HttpVerbs.Post)] 
public void OpenTrade(float? price) 

Il mio prezzo è sempre nullo. Se ometto lo ?, il controller non viene chiamato affatto (il che non è nulla di sorprendente), ho provato a utilizzare decimal e il tipo double. Inoltre, questa funzione funziona quando sto inviando dati interi (se invio 1 questo controller è chiamato, e float? price è compilato correttamente). Mi sto perdendo qualcosa, o è un bug?

Ad. Posso ricevere il prezzo come stringa, e quindi analizzarlo manualmente, ma non mi piace questa soluzione, in quanto non è elegante e combatte l'intero scopo dell'utilizzo di framework come MVC per farlo per me.

Edit & Risposta: Utilizzando il consiglio di Joel, ho creato un modello Binder, che vi posterò, forse qualcuno lo userà:


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 
} 

Può essere registrato come doppio e doppio? legante, per il doppio? passerà null al controller, se il valore non può essere stato risolto.

Btw. Qualche idea del perché fluttuare e raddoppiare non funzionano fuori dalla scatola (per me?)?

Edit2 & Soluzione: Ok, questo sarà divertente :). Non ha funzionato per me, perché la stringa richiesta stava inviando 1.5432 (un valore di esempio), che è perfettamente ok, ma ... MVC stava provando a decodificarlo internamente usando le mie impostazioni cultura, che si aspettano che i numeri siano in formato 1 , 5432, quindi la conversione è fallita silenziosamente.
Quindi, cosa da ricordare: se vivi in ​​un paese straniero, controlla le impostazioni della tua cultura.

+1

ho cercato di serraggio insieme un'applicazione di test per vedere se riuscivo a ricreare il problema originale (cut'n'pasted sia la vostra chiamata jQuery e la firma azione), ma tutto funziona bene per me. Il parametro float ha sempre il valore. .... strano eh –

+1

Loro lavorano per me. Usa uno strumento HTTP come Fiddler o HttpWatch per vedere se il tuo post AJAX è formato correttamente. –

+0

È strano ... Darò uno sguardo più da vicino a questo, forse scoprirò cosa c'è che non va. –

risposta

5

creare un raccoglitore modello galleggiante. Ciò può estrarre il valore appropriato dall'insieme di moduli, analizzarlo e restituirlo come argomento

0

MODIFICA: È necessario utilizzare il post di jQuery? C'è un modo per utilizzare il supporto integrato per ajax per creare un collegamento e qual è il risultato in tal caso? per esempio.

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

Quando si specifica un valore float è generalmente necessario postfix il valore con 'f', ad es.

float f = 1.5f; 

Hai provato questo?

Una soluzione alternativa potrebbe essere quella di cambiare il metodo di servizio per:

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

Annuncio 1. Ricorda che ho il numero dentro javascript, non dentro il codice C#, quindi aggiungere "f" non sarebbe di aiuto. Annuncio 2. È una soluzione, ma è anche meno elegante di ottenere imho stringa (sto ignorando il fatto, che sto passando il valore del denaro come numero float, che non è quasi mai una buona idea, ma in questo caso, So cosa sto facendo) –

+0

Ad edit. Piuttosto ho bisogno di tutta la logica implementata in JS, dato che non sto mettendo pochi collegamenti con le query su ajax, inoltre, non credo che il problema risieda nel lato JS, che è solo il passaggio dei dati a MVC in un determinato formato. –

+0

Ad 1. Ovviamente, stupido me :) –

0

Avete controllato per vedere quale sarà la risposta JSON dal server è?Ho notato che non avete incapsulato la variabile prezzo con le doppie virgolette, in modo che il messaggio al server sarà simile:

{'price':1.5} 

Non so se questo sarà un problema con un solo parametro di dati, ma io sospetta che quello che realmente vuole farlo sembrare come è

"{'price':1.5}" 

metodi jQuery Ajax essere passato ai metodi ASP.Net dovrebbe avere una stringa per il parametro di dati altrimenti jQuery può puntate i dati in modo non corretto. Avere la stringa significa che jQuery lascerà l'oggetto JSON da solo e passerà l'intera stringa ad ASP.NET per l'analisi sul lato server.

+0

Non penso che sia così, quando ho fatto quello che mi hai consigliato, tutto ha smesso di funzionare :), come se avessi provato a passare qualche altro dati, che sono una stringa - non sono stati deserializzati da mvc. –

2
{ price: '1,5' } 

dovrebbe andare bene.

+0

Ho riscontrato molti problemi simili. Usare la stringa e convertirla in controller è il modo più semplice, a volte anche il più elegante, per farlo funzionare. –

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

Si prega di formattare il codice. –