动态返回类型不起作用但jsonresult返回类型工作

我遇到了一个我不知道如何解决的问题。 我有一个简单的控制器,其返回类型是动态但不起作用。

public dynamic GetPosts() { var ret = (from post in db.Posts.ToList() orderby post.PostedDate descending select new { Message = post.Message, PostedBy = post.PostedBy, PostedByName = post.ApplicationUser.UserName, PostedByAvatar = _GenerateAvatarUrlForUser(post.PostedBy), PostedDate = post.PostedDate, PostId = post.PostId, }).AsEnumerable(); return ret; } 

如果我将此动态返回类型更改为JsonResult并替换return ret以返回Json(ret,JsonRequestBehavior.AllowGet); 它会工作。 在我使用web api控制器之前它运行良好的动态返回类型,但不知何故,我面临一些问题,所以我决定使用普通控制器。 我有一个淘汰视图模型,其工作是动态地将post和评论附加到视图页面上。这样的事情—

  function viewModel() { var self = this; self.posts = ko.observableArray(); self.newMessage = ko.observable(); self.error = ko.observable(); self.loadPosts = function () { // to load existing posts $.ajax({ url: postApiUrl1, datatype: "json", contentType: "application/json", cache: false, type: 'Get' }) .done(function (data) { var mappedPosts = $.map(data, function (item) { return new Post(item); }); self.posts(mappedPosts); }) .fail(function () { error('unable to load posts'); }); } self.addPost = function () { var post = new Post(); post.Message(self.newMessage()); return $.ajax({ url: postApiUrl, dataType: "json", contentType: "application/json", cache: false, type: 'POST', data: ko.toJSON(post) }) .done(function (result) { self.posts.splice(0, 0, new Post(result)); self.newMessage(''); }) .fail(function () { error('unable to add post'); }); } self.loadPosts(); return self; }; 

onButton点击,发布和评论已正确保存在数据库中,但未动态附加到视图页面。 我在这里上传错误的图像—– 在此处输入图像描述

我不知道丢失了什么。这个错误信息指向的是什么。 如何解决?如果缺少任何代码,请告诉我我也会上传

默认情况下,Web API控制器能够返回序列化为XML或JSON的数据,具体取决于请求标头。 因此,当您使用API​​控制器时,数据将以正确的格式返回给客户端。

对于MVC控制器,您可以返回某种ActionResult ,它将以可预测的格式发送响应。 如果您返回任何其他对象,您实际上无法直接控制它的格式。 例如,返回一个字符串返回一个原始字符串。 但是,如果你返回任何其他对象,还不清楚会返回什么。 我认为,默认情况下,它会执行toString()

更新: 我刚刚判断返回动态对象时的响应是什么,它是一个text/html响应,动态对象转换为字符串例如,使用此操作:

  // GET Mailing/ArticuloVagon/dynamic [HttpGet] public dynamic Dynamic() { var r = new { a = 23, b = "kk", c = new List {"x", "y", "z"} }; return r; } 

你收到这个回复:

 Header: Content-Type:text/html; charset=utf-8 Content: { a = 23, b = kk, c = System.Collections.Generic.List`1[System.String] } 

因此,要向客户端返回有用的信息,您需要指定它。 要返回JSON,最简单的方法是返回JsonActionResult ,或手动创建响应。

正如您在自己的问题中所说,使用JsonActionResult没有问题。 我建议你使用它。

但是,解决使用Web API控制器进行路由的问题要好得多,并且Web API控制器更轻松。 也许您应该打开一个新问题来说明路由问题是什么。 我相信他们真的很容易解决。 我有很多使用这两种控制器的项目。