2015-10-02 3 views
9

Il mio problema è che quando provo a inviare un doppio o decimale tramite ajax nel mio controller MVC C# il valore è sempre nullo. Posso inviare il valore come stringa e posso inviare numeri interi senza problemi. Perché non posso inviare valori con decimali? Quando controllo la richiesta inviata dal client, il valore corretto è lì (Dati modulo è price=84.50).C# Il controller MVC non può ottenere valori decimali o doppi dalla richiesta POST Ajax

Errore:

The parameters dictionary contains a null entry for parameter 'price' of non-nullable type 'System.Decimal'

Html:

<input type="number" step="1" class="form-control" name="price" id="price"> 
<button type="button" class="btn btn-success">Send</button> 

Javascript:

$('.btn-success').click(function() { 

    //var price = $('#price').val(); - Did not work 
    //var price = Number($('#price').val()); Did not work 
    var price = Number($('#price').val()).toFixed(2); // Does not work 

    $.ajax({ 
     url: 'PriceFunction', 
     type: 'POST', 
     data: { 
      price: price, 
     } 
    }).done(function() { 

    }).fail(function() { 
     console.log("Error in ajaxfunction!"); 
    }); 
}); 

C#:

[HttpPost] 
    public void PriceFunction(decimal price) 
    { 
    // I have tried with decimal, double and double?.  
    } 
+1

manca un **. ** dopo '' val() '' –

+0

Mi spiace che ci fosse nel mio codice originale, lo ho formattato per adattarlo a Stackoverflow e devo averlo cancellato. – Ogglas

+0

non è stato possibile riprodurre questo problema, "var price = $ ('# price'). Val();" ha funzionato perfettamente il problema vive un po 'altrove. Posso postare una schermata come risposta, se ti va. – SHM

risposta

10

È necessario stringa i tuoi dati quando si inviano i valori decimali.

data: JSON.stringify({ Price: 5.0 }) 

Questo perché il decimale è considerato un numero intero dal raccoglitore predefinito.

Si potrebbe di cambiare rotta per utilizzare il DecimalModelBinder che è dettagliato al seguente link:

ASP.NET MVC3 JSON decimal binding woes

+0

Grazie, ha funzionato perfettamente! – Ogglas

+0

Questa soluzione ha funzionato! In effetti, la stessa strategia funziona per le interfacce utente in portoghese, dove la rappresentazione decimale è diversa da quella predefinita in .net. –

0

Provare a cambiare

var price = Number($('#price').val().toFixed(2)); 

Per

var price = parseFloat($('#price').val()).toFixed(2); 
+0

Non funziona. Lo stesso errore di sopra. – Ogglas

2

Prova stringifying il JSON passato al parametro i dati della chiamata AJAX. Questo dovrebbe fare il trucco.

var data = { price: price }; 

$.ajax({ 
    url: 'PriceFunction', 
    type: 'POST', 
    data: JSON.stringify(data) 
}). 
1

primo luogo, utilizzando toFixed in questo modo dovrebbe farti un errore dal momento che si sta tentando di utilizzare tale metodo su oggetto jQuery

uso
parseFloat(value).toFixed(2)

0

L'errore dice i dati di prezzo: {prezzo : prezzo} è in realtà dato: {prezzo: null} durante la pubblicazione.

Quindi questo codice,

Number ($ ('# prezzo') val() toFixed (2)..);

restituisce valore nullo. Per essere più precisi, cambia la chiamata di Number() a parseFloat() per ottenere il risultato corretto. Di seguito è riportato il codice testato e funzionante.

enter image description here

Ajax chiamata:

<script language="javascript"> 
    function TriggerAction() 
    { 
     alert($('#price').val()); 
     var price = parseFloat($('#price').val()).toFixed(2); 
     alert(price); 
     callAjax("PriceFunction", price); 
    } 

    function ajaxCallResult(result, action) 
    { 
     if (action==="PriceFunction") 
     { 
      alert(result); 
     } 
     else if (action==="error") 
     { 
      alert("Error: "+action+" call failed!"); 
     } 
    } 

    function callAjax(action, param) { 

     $.ajax({ 
      type: "POST", 
      url: "/Home/"+action,  
      data: {param: param}, 
      success: function (result) { 
       ajaxCallResult(result, action); 
      }, 
      error: function (req, status, error) { 
       ajaxCallResult("error", action); 
      } 
     }); 
    } 
</script> 

<input type="number" step="1" class="form-control" name="price" id="price"> 
<button type="button" class="btn btn-success" onclick="TriggerAction();">Send</button> 

MVC Codice:

 [HttpPost] 
     public ActionResult PriceFunction(decimal param) 
     { 
      return Json("OK Got the value:" + param.ToString()); 
     } 
0

Provare a cambiare:

public class test 
    { 
     public decimal Price { get; set; } 
    } 

    [HttpPost] 
    public void Test(test whatever) 
    { 
     // I have tried with decimal, double and double?.  
    } 

Cura circa Nome e dataType: 'json' in Ajax chiama

3

Questo potrebbe essere un problema di cultura

Assicurarsi che la stringa che si invia alla propria azione sia conforme alla cultura corrente. (Controllare il numero decimale separatori .,)

Esempio

esempio su un server francese, 99.1 non verrà interpretato come 99,1, ma verrà convertito in 0.

Soluzione

In tal caso, una soluzione è quella di aggiungere questa riga

<system.web> 
    ... 
    <globalization uiCulture="en" culture="en-US"/> 
    </system.web> 

nel vostro Web.Config

O, sostituendo il separatore da quella corretta sul client lato.

1

Suggerisco di provare a passare i dati come JSON.

data: JSON.stringify({ price: price }), 
contentType: "application/json; charset=utf-8" 

Basta prestare attenzione per includere il tipo di contenuto. Potrebbe essere necessario affinché il raccoglitore sappia come analizzare i dati della richiesta.

+0

Impostazione contentType ha risolto il mio problema. – FrenkyB