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?.
}
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:
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.
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)
}).
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.
Essayez de changer
var price = Number($('#price').val().toFixed(2));
À
var price = parseFloat($('#price').val()).toFixed(2);
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.
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.
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());
}
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