这里已经有一些类似的帖子,并尝试了所有解决方案,但仍然无效......我无法在控制器内获取值,它始终为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; }
}
答案 0 :(得分:23)
谢谢你们的指示和解决方案。解决方案是所有建议的组合,所以我决定在一个帖子中进行整理。
问题的解决方案如下:
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; }
}
希望它能帮助某人澄清整个画面!
答案 1 :(得分:3)
我有同样的问题(参数总是为null),但我的解决方案不同。
确保您的ActionResult方法参数与JSON对象属性的名称不同。
在这个例子中,我将myParam重命名为myNewParam,以区别于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 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
答案 2 :(得分:1)
在我看来,你正在尝试传递一系列对象:
JSONString3 = { HAxis : [{ Name : "monday" }] };
当你的行动只需要一个时:
public ActionResult getChart(YAxis HAxis)
也许你只想通过一个?
JSONString3 = { "Name": "monday" };
答案 3 :(得分:0)
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参考。
答案 4 :(得分:-1)
向控制器方法添加数据类型属性为我解决了这个问题。
[JsonFilter(Param="yourParamName", JsonDataType=typeof(YourParamType))]
[HttpPost]
public ActionResult yourFunction(YourParamType YourParamName)
{
//do some stuff
}