在我的控制器中,我有以下方法..非常直接。
namespace Playground.Controllers
{
public class TasksController : Controller
{
// an ajax call to this generates the server error in the response
// "Value cannot be null. Parameter name: controllerContext"
[HttpGet]
public JsonResult GetTask()
{
List<Task> tasks = GetTasks();
return Json(tasks, JsonRequestBehavior.AllowGet);
}
// an ajax call to this comes back successful, but only outputs
// "System.Collections.Generic.List`1[Playground.Models.Task]"
// which, when expanded... is empty
[HttpGet]
public List<Task> GetTasks()
{
//Create an array to hold all of the task objects
var tasks = new List<Task> { };
//Execute the select statement and get back a SqlDataReader object
DataTable table = DataAccess.ExecuteSelect("select Id, Name, Description, Starting, Ending from Tasks");
foreach (DataRow dr in table.Rows)
{
//Assign values to the task object
Task task = new Task((int)dr["Id"],
(string)dr["Name"],
(string)dr["Description"],
(DateTime)dr["Starting"],
(DateTime)dr["Ending"]);
//Add task object to list of task objects
tasks.Add(task);
}
return tasks;
}
}
}
创建Task类型的对象。这里显示的类
namespace Playground.Models
{
public class Task : Controller
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public DateTime Starting { get; set; }
public DateTime Ending { get; set; }
public Task(int Id, string Name, string Description, DateTime Starting, DateTime Ending)
{
this.Id = Id;
this.Name = Name;
this.Description = Description;
this.Starting = Starting;
this.Ending = Ending;
}
}
}
我对该方法进行了Ajax调用。
$.ajax({
type: "GET",
url: "Tasks/GetTasks", //Changed between GetTasks and GetTask for testing.
dataType: "html",
//dataType: "json",
async: false,
data: { },
success: function (data, text) {
console.dir(data);
console.dir(text);
},
error: function (request, status, error) {
//do something
}
});
两个console.dir()行的输出:
System.Collections.Generic.List`1[Playground.Models.Task]
No Properties
Tasks.js:12
success
No Properties
Tasks.js:13
如何找回Javascript对象,我可以循环遍历数组中的每个“任务”...根据需要输出“Id”,“Name”(等)?
我在C#中尝试了各种组合来转换我的任务列表但没有成功
//Error on the Serialize line
// "Exception has been thrown by the target of an invocation."
public JsonResult GetTask()
{
List<Task> tasks = GetTasks();
JavaScriptSerializer ser = new JavaScriptSerializer();
object obj = tasks;
var val = ser.Serialize(obj);
return Json(val, JsonRequestBehavior.AllowGet);
}
--- AND ---
//Returns a server error to JS
//Value cannot be null. Parameter name: controllerContext
public JsonResult GetTask()
{
List<Task> tasks = GetTasks();
JsonResult jr = new JsonResult();
jr.Data = Json(tasks);
jr.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
return jr;
}
--- AND ---
//Returns a server error to JS
//Value cannot be null. Parameter name: controllerContext
public JsonResult GetTask()
{
List<Task> tasks = GetTasks();
return Json(tasks, JsonRequestBehavior.AllowGet);
}
--- AND ---
//Returns a server error to JS
//Value cannot be null. Parameter name: controllerContext
[HttpGet]
public JsonResult GetTask()
{
Task task = new Task(0, "Name", "Desc", new DateTime(), new DateTime());
return Json(task, JsonRequestBehavior.AllowGet);
}
答案 0 :(得分:5)
您正在请求HTML而不是JSON,因此它将返回值转换为字符串而不是JSONifying它。将您的dataType
更改为json
。
修改强>
我假设您来自ApiController
而不是Controller
。根据您的评论,情况可能并非如此。根据您是在开发API还是仅添加将JSON返回到标准控制器的操作,我建议的是不同的。如果您正在开发API,那么您应该从ApiController
派生,然后内容类型将确定结果的格式。如果您只是使用返回JSON的方法扩展标准控制器,那么您将需要返回JsonResult。在后一种情况下,您需要同时请求json
并将您的操作更新为:
[HttpGet]
public JsonResult GetTasks()
{
//Create an array to hold all of the task objects
var tasks = new List<Task> { };
//Execute the select statement and get back a SqlDataReader object
DataTable table = DataAccess.ExecuteSelect("select Id, Name, Description, Starting, Ending from Tasks");
foreach (DataRow dr in table.Rows)
{
//Assign values to the task object
Task task = new Task((int)dr["Id"],
(string)dr["Name"],
(string)dr["Description"],
(DateTime)dr["Starting"],
(DateTime)dr["Ending"]);
//Add task object to list of task objects
tasks.Add(task);
}
return Json(tasks, JsonRequestBehavior.AllowGet);
}