Il y a déjà quelques articles similaires ici, et essayé toutes les solutions suggérées, et cela ne fonctionne toujours pas ... Je ne peux pas obtenir de valeur dans le contrôleur, elle est toujours nulle. Ci-dessous le code. Est-ce que je manque quelque chose?
Javascript côté client
function getChart() {
JSONString3 = { HAxis : [{ Name : "monday" }] };
jQuery.ajaxSettings.traditional = true;
$.ajax({
url: "@Url.Action("getChart","SBM")",
type: 'POST',
contentType: 'json',
dataType: 'html',
data: JSONString3,
success: function (data) {
var imagestring = btoa(data);
$('#ChartImage').attr('src', "data:image/png;base64," + imagestring + "?" + new Date().getTime());
}
})
jQuery.ajaxSettings.traditional = false;
}
Contrôleur MVC
[Authorize]
[HttpPost]
public ActionResult getChart(YAxis HAxis)
{
YAxis XAxisvalue = HAxis;
Charts chart = new Charts();
MemoryStream ms = new MemoryStream();
chart.Chart.SaveImage(ms);
string image = Convert.ToBase64String(ms.GetBuffer());
return File(ms.GetBuffer(), "image/png", "Chart.png");
}
Modèle
public class YAxis
{
public string Name { get; set; }
}
Merci les gars pour les directions et les solutions. La solution étant une combinaison de toutes vos suggestions, j'ai donc décidé de l'arrondir en un seul poste.
La solution au problème est la suivante:
contentType
devrait être application/json
(comme Ant P suggéré ci-dessus)JSONString3 = {"Name" : "monday" }
(comme Ant P suggéré ci-dessus)stringifyed
comme suit: JSONString3 = JSON.stringify(JSONString3)
(comme suggéré par Quan)Javascript côté client
function getChart() {
JSONString3 = { "Name" : "monday" };
jQuery.ajaxSettings.traditional = true;
$.ajax({
url: "@Url.Action("getChart","SBM")",
type: 'POST',
contentType: 'application/json',
dataType: 'html',
data: JSON.stringify(JSONString3),
success: function (data) {
var imagestring = btoa(data);
$('#ChartImage').attr('src', "data:image/png;base64," + imagestring + "?" + new Date().getTime());
}
})
jQuery.ajaxSettings.traditional = false;
}
Contrôleur MVC
[Authorize]
[HttpPost]
public ActionResult getChart(YAxis HAxis)
{
YAxis XAxisvalue = HAxis;
Charts chart = new Charts();
MemoryStream ms = new MemoryStream();
chart.Chart.SaveImage(ms);
string image = Convert.ToBase64String(ms.GetBuffer());
return File(ms.GetBuffer(), "image/png", "Chart.png");
}
Modèle
public class YAxis
{
public string Name { get; set; }
}
Au lieu de cela:
JSONString3 = { "Name" : "monday" };
nous pouvons le faire:
var JSONString3 = {};
JSONString.Name = "monday";
Mais il faut encore formater l'objet avant de l'envoyer au contrôleur !!!
Pour transmettre plusieurs objets au contrôleur, voici l'exemple
Javascript côté client
function getChart() {
//first json object
//note: each object Property name must be the same as it is in the Models classes on server side
Category = {};
Category.Name = "Category1";
Category.Values = [];
Category.Values[0] = "CategoryValue1";
Category.Values[1] = "CategoryValue2";
//second json object
XAxis = {};
XAxis.Name = "XAxis1";
XAxis.Values = [];
XAxis.Values[0] = "XAxisValue1";
XAxis.Values[1] = "XAxisValue2";
//third json object
YAxis = {};
YAxis.Name = "YAxis1";
//convert all three objects to string
//note: each object name should be the same as the controller parameter is!!
var StringToPost = JSON.stringify({CategoryObject : Category, XAxisObject : XAxis, YAxisObject : YAxis});
$.ajax({
url: "@Url.Action("getChart","SBM")",
type: 'POST',
contentType: "application/json",
dataType: 'html',
data: StringToPost,
success: function (data) {
var imagestring = btoa(data);
$('#ChartImage').html(data);
}
})
}
Contrôleur MVC
[HttpPost]
public ActionResult getChart(Category CategoryObject, XAxis XAxisObject, YAxis YAxisObject)
{
//do some stuff with objects here and return something to client
return PartialView("_Chart");
}
Modèle de catégorie
public class Category
{
public string Name { get; set; }
public List<string> Values { get; set; }
}
Modèle XAxis
public class XAxis
{
public string Name { get; set; }
public List<string> Values { get; set; }
}
Modèle YAxis
public class YAxis
{
public string Name { get; set; }
}
J'espère que cela aidera quelqu'un à clarifier la situation!
J'ai eu le même problème (paramètre toujours nul), mais ma solution était différente.
Assurez-vous que votre paramètre de méthode ActionResult ne porte pas le même nom que la propriété d'objet JSON.
Dans cet exemple, j'ai renommé myParam en myNewParam pour le différencier de la propriété MyParam.
Exemple: Cela ne fonctionnera pas:
var myObj = {
ID: '0',
MyParam: $('#mycontrol').val(),
};
$.ajax({
type: "POST",
url: '@Url.Action("MyAction", "MyModel")',
cache: false,
data: JSON.stringify(myObj),
datatype: 'json',
contentType: "application/json; charset=utf-8",
success: function (result) {
}
})
[HttpPost]
public ActionResult MyAction(Class1 myParam)
Cela fonctionnera:
var myObj = {
ID: '0',
MyParam: $('#mycontrol').val(),
};
$.ajax({
type: "POST",
url: '@Url.Action("MyAction", "MyModel")',
cache: false,
data: JSON.stringify(myObj),
datatype: 'json',
contentType: "application/json; charset=utf-8",
success: function (result) {
}
})
[HttpPost]
public ActionResult MyAction(Class1 myNewParam) -->renamed
Il me semble que vous essayez de transmettre un tableau d'objets:
JSONString3 = { HAxis : [{ Name : "monday" }] };
Quand votre action n'en veut qu'une:
public ActionResult getChart(YAxis HAxis)
Peut-être que tu voulais seulement en passer un?
JSONString3 = { "Name": "monday" };
JSONString3 = { "Name": "monday" };
Vous devriez l'envoyer au contrôleur en tant que chaîne, utilisez donc JSON.stringify pour convertir. Je ne sais pas comment utiliser votre type ajax.
$.post('@Url.Action("getChart","SBM")', {yourJson : data:JSON.stringify(JSONString3)} , function(data) {
if (data.success) {
var imagestring = btoa(data.name);
$('#ChartImage').attr('src', "data:image/png;base64," + imagestring + "?" + new Date().getTime());
}
});
Dans le contrôleur,
public ActionResult getChart(string yourJson)
{
YAxis yAxis= JsonConvert.DeserializeObject<YAxis>(yourValue);
// ....... your code here
return Json(new{success=true,name=yAxis.Name},JsonRequestBehavior.AllowGet);
}
** Remarque: JsonConvert est une méthode d'utilisation de Newtonsoft.Json. , veuillez ajouter une référence Newtonsoft.