すでにいくつかの同様の投稿があり、提案されたすべての解決策を試しましたが、それでも機能しません...コントローラー内で値を取得できません。常にnullです。以下はコードです。何か不足していますか?
クライアント側のJavaScript
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;
}
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");
}
モデル
public class YAxis
{
public string Name { get; set; }
}
指示と解決策をありがとうございました。解決策はあなたの提案のすべての組み合わせなので、1つの投稿にまとめることにしました。
この問題の解決策は次のとおりです。
contentType
は_application/json
_である必要があります(Ant Pが上記で提案したとおり)JSONString3 = {"Name" : "monday" }
_の形式である必要があります(Ant Pが上記で提案したとおり)stringifyed
である必要があります:JSONString3 = JSON.stringify(JSONString3)
(Quanが提案したとおり)クライアント側のJavaScript
_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;
}
_
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");
}
_
モデル
_public class YAxis
{
public string Name { get; set; }
}
_
これの代わりに:
_JSONString3 = { "Name" : "monday" };
_
できるよ:
_var JSONString3 = {};
JSONString.Name = "monday";
_
しかし、コントローラーに投稿する前に、オブジェクトを文字列化する必要があります!!!
複数のオブジェクトをコントローラに渡すには、以下の例をご覧ください
クライアント側のJavaScript
_ 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);
}
})
}
_
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");
}
_
カテゴリモデル
_public class Category
{
public string Name { get; set; }
public List<string> Values { get; set; }
}
_
XAxisモデル
_public class XAxis
{
public string Name { get; set; }
public List<string> Values { get; set; }
}
_
YAxisモデル
_public class YAxis
{
public string Name { get; set; }
}
_
それが誰かが全体像を明確にするのに役立つことを願っています!
同じ問題(パラメーターは常にnull)がありましたが、解決策は異なりました。
ActionResultメソッドパラメータの名前がJSONオブジェクトプロパティと同じでないことを確認してください。
この例では、MyParamプロパティと区別するために、myParamの名前をmyNewParamに変更しました。
例:これは機能しません:
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)
これは動作します:
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
オブジェクトの配列を渡そうとしているように見えます:
JSONString3 = { HAxis : [{ Name : "monday" }] };
アクションが1つだけ必要な場合:
public ActionResult getChart(YAxis HAxis)
たぶん、あなたは1つだけを渡すつもりでしたか?
JSONString3 = { "Name": "monday" };
JSONString3 = { "Name": "monday" };
あなたはそれを文字列としてコントローラに投稿する必要があるので、JSON.stringifyを使用して変換します。私はあなたのajaxタイプの使い方を知りません、$。postを使うことを知っています... T_T
$.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());
}
});
コントローラでは、
public ActionResult getChart(string yourJson)
{
YAxis yAxis= JsonConvert.DeserializeObject<YAxis>(yourValue);
// ....... your code here
return Json(new{success=true,name=yAxis.Name},JsonRequestBehavior.AllowGet);
}
**注:JsonConvertはNewtonsoft.Jsonを使用する方法です。 、Newtonsoftリファレンスを追加してください。