wake-up-neo.net

C # MVC-Controller kann keine dezimalen oder doppelten Werte von Ajax erhalten POST anfordern

Mein Problem ist, dass der Wert immer null ist, wenn ich versuche, eine Doppel- oder Dezimalzahl über Ajax in meinen C # MVC-Controller zu senden. Ich kann den Wert als String senden und ohne Probleme Integers senden. Warum kann ich keine Werte mit Dezimalzahlen senden? Wenn ich die vom Client gesendete Anforderung überprüfe, ist der korrekte Wert dort angegeben (Formulardaten sind price=84.50).

Error:

Das Parameterwörterbuch enthält einen Null-Eintrag für den Parameter 'price' des nicht-nullfähigen Typs '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

Sie müssen Ihre Daten festlegen, wenn Sie Dezimalwerte senden.

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

Dies liegt daran, dass die Dezimalzahl vom Standardordner als Ganzzahl betrachtet wird. 

Sie können natürlich die DecimalModelBinder verwenden, die unter dem folgenden Link beschrieben wird:

ASP.NET MVC3 JSON Dezimale Bindungsprobleme

10
Stuart L

Dies könnte ein Kulturproblem sein

Vergewissern Sie sich, dass die Zeichenfolge, die Sie an Ihre Aktion senden, der aktuellen Kultur entspricht. (Überprüfen Sie die Dezimalzahl-Trennzeichen .,)

Beispiel

z.B. Auf einem französischen Server wird 99.1 nicht als 99,1 verstanden, sondern in 0 konvertiert.

Lösung

In diesem Fall besteht eine Lösung darin, die Kultur in Ihrem Web.Config zu definieren.

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

Oder , Ersetzen des Trennzeichens durch das richtige Trennzeichen auf der Clientseite.

Versuchen Sie, den an den Datenparameter des ajax-Aufrufs übergebenen JSON-String zu definieren. Das sollte den Trick tun.

var data = { price: price };

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

Erstens sollte die Verwendung von toFixed auf diese Weise zu einer Fehlermeldung führen, da Sie versuchen, diese Methode für jquery-Objekte zu verwenden

verwenden
parseFloat(value).toFixed(2)

1
Esko

Ich schlage vor, die Daten als JSON zu übergeben.

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

Achten Sie einfach darauf, den Inhaltstyp anzugeben. Es kann erforderlich sein, dass der Ordner wissen kann, wie er die Daten Ihrer Anfrage analysiert.

1

Versuchen Sie es zu ändern 

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

Zu

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

Für mich funktioniert nur dieser Weg:

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

Es hängt wahrscheinlich von Ihrer aktuellen Kultur in der Umgebung ab ... Ich hoffe, es wird jemandem helfen.

0
gutkol

Der Fehler sagt Ihre Preisdaten aus: {price: price} sind tatsächlich Daten: {price: null} während des Postens.

Also dieser Code, 

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

gibt den Wert null zurück. Um genauer zu sein, ändern Sie den Aufruf von Number () in parseFloat (), um das korrekte Ergebnis zu erhalten. Unten ist der getestete und funktionierende Code.

 enter image description here

Ajax Call:

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

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

Ich musste ein komplexeres Modell binden, daher war die Stringify-Lösung nicht das, was ich wollte. Also habe ich diesen Artikel gefunden, der zeigt, wie man den Standard-Modellordner erweitert, um Dezimalstellen zu akzeptieren.

Hier ist der Code von haacked.com :

Zuerst erweitern Sie IModelBinder:

using System;
using System.Globalization;
using System.Web.Mvc;

public class DecimalModelBinder : IModelBinder {
    public object BindModel(ControllerContext controllerContext, 
        ModelBindingContext bindingContext) {
        ValueProviderResult valueResult = bindingContext.ValueProvider
            .GetValue(bindingContext.ModelName);
        ModelState modelState = new ModelState { Value = valueResult };
        object actualValue = null;
        try {
            actualValue = Convert.ToDecimal(valueResult.AttemptedValue, 
                CultureInfo.CurrentCulture);
        }
        catch (FormatException e) {
            modelState.Errors.Add(e);
        }

        bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
        return actualValue;
    }
}

Dann registrieren Sie diesen Ordner:

protected void Application_Start() {
    AreaRegistration.RegisterAllAreas();

    ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());

    // All other stuff ...
}
0
gtu

Versuchen Sie es zu ändern: 

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

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

Achten Sie auf die Eigenschaft Name und Datentyp: 'Json' im Ajax-Aufruf

0
RomainV