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.
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 –
Loro lavorano per me. Usa uno strumento HTTP come Fiddler o HttpWatch per vedere se il tuo post AJAX è formato correttamente. –
È strano ... Darò uno sguardo più da vicino a questo, forse scoprirò cosa c'è che non va. –