web-dev-qa-db-fra.com

Le contrôleur C # MVC ne peut pas obtenir de valeurs décimales ou doubles d'Ajax POST demande

Mon problème est que lorsque j'essaie d'envoyer un double ou un nombre décimal via ajax dans mon contrôleur C # MVC, la valeur est toujours nulle. Je peux envoyer la valeur sous forme de chaîne et je peux envoyer des entiers sans problème. Pourquoi ne puis-je pas envoyer de valeurs avec des décimales? Lorsque je vérifie la demande envoyée par le client, la valeur correcte est indiquée (Les données de formulaire sont price=84.50).

Erreur:

Le dictionnaire de paramètres contient une entrée nulle pour le paramètre 'price' de type non nul '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?.     
    }
10
Ogglas

Vous devez chiffrer vos données lorsque vous envoyez des valeurs décimales.

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

En effet, la décimale est considérée comme un entier par le classeur par défaut. 

Vous pouvez bien sûr changer pour utiliser la DecimalModelBinder qui est détaillée au lien suivant:

ASP.NET MVC3 JSON - Liaisons décimales

10
Stuart L

Cela pourrait être un problème de culture

Assurez-vous que la chaîne que vous envoyez à votre action est conforme à la culture actuelle. (cochez les séparateurs décimaux .,)

Exemple

par exemple. Sur un serveur français, 99.1 ne sera pas compris comme 99,1, mais sera converti en 0.

Solution

Dans ce cas, une solution consiste à définir la culture dans votre Web.Config

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

Ou , en remplaçant le séparateur par celui qui convient du côté client.

6

Essayez de codifier le JSON transmis au paramètre data de l'appel ajax. Cela devrait faire l'affaire.

var data = { price: price };

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

Je suggère d'essayer de transmettre les données en JSON.

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

Faites juste attention à inclure le type de contenu. Il peut être nécessaire pour que le classeur sache analyser les données de votre demande.

1
Bruno de Andrade

Essayez de changer 

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

À

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

Pour moi, seule cette méthode fonctionne:

type: "POST",
data: 'price': parseFloat($(#price).val()).toFixed(2).replace(".", ","),
success: function(data){
...
}

Cela dépend probablement de votre culture actuelle en environnement ... J'espère que cela aidera quelqu'un.

0
gutkol

L'erreur indique vos données de prix: {prix: prix} est en réalité des données: {prix: null} lors de la publication.

Donc ce code, 

Number ($ ('# prix'). Val (). ToFixed (2));

renvoie la valeur null. Pour être plus précis, modifiez l'appel Number () en parseFloat () pour obtenir le résultat correct. Vous trouverez ci-dessous le code testé et fonctionnel.

 enter image description here

Appel Ajax:

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

Code MVC:

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

Essayez de changer: 

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

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

Entretien de la propriété Nom et type de données: 'json' dans un appel Ajax

0
RomainV