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

时间:2015-11-10 04:55:21

标签: jquery asp.net-mvc linq dynamic knockout.js

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

  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控制器之前,它在动态返回类型下工作正常但不知何故我遇到了一些问题所以我决定使用普通控制器。 我有一个淘汰视图模型,其工作是动态地将帖子和评论附加到视图页面上。就像这样---

   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点击,发布和评论已正确保存在数据库中,但未动态附加到视图页面。 我在这里上传错误图像----- enter image description here

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

1 个答案:

答案 0 :(得分:0)

默认情况下,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<string> {"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控制器更轻松。也许您应该打开一个新问题来说明路由问题是什么。我相信他们真的很容易解决。我有很多使用这两种控制器的项目。