【问题标题】:Dynamic return type not working but jsonresult return type working动态返回类型不起作用但 jsonresult 返回类型起作用
【发布时间】:2016-02-10 22:14:18
【问题描述】:

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

  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 替换为 return 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 点击​​、发布和评论已正确保存在数据库中,但不会动态附加到视图页面。 我在这里上传错误图片-----

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

【问题讨论】:

  • 使用return Json(ret, JsonRequestBehavior.AllowGet);有什么问题?
  • @nemesv 动态绑定查看页面无法正常工作,正如您在此演示中看到的 techbrij.com/…
  • 你好像在服务器端出现异常,你试过调试吗?目前尚不清楚您当前使用的是否是 Api 控制器,我假设它是并建议将 dynamic(在方法签名中)更改为 HttpResponseMessagereturn ret; 更改为 return Request.CreateResponse(HttpStatusCode.OK, ret, Configuration.Formatters.JsonFormatter);
  • 我使用的是普通控制器..... api 控制器在路由@haim770 中引起了太多问题
  • 那么为什么dynamic,为什么不return Json(ret, JsonRequestBehavior.AllowGet);

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


【解决方案1】:

默认情况下,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 控制器更轻。也许您应该打开一个新问题,说明路由存在哪些问题。我敢肯定他们真的很容易解决。我有很多项目同时使用这两种类型的控制器。

【讨论】:

  • 抱歉回复晚了...我可以在这里使用动态返回类型吗?或者如果我使用 JsonResultType,那么 Self.addPost 函数中缺少什么我想从 textArea 框中动态附加消息以查看页面。现在,单击按钮时,没有任何反应,但数据保存在 dbase 中,如果我刷新整个页面,则文本区域框中的文本与其他帖子和 cmets 一起显示在顶部。希望你明白我在说什么
  • 您可以返回部分视图,并添加 HTML,或返回 JSON 结果,并动态创建和添加 HTML 元素。你不能做的是返回dynamicobject,因为客户端收到了一个无用的答案。如果您还有其他问题,例如如何创建动态元素或使用部分视图,请在 Google 上搜索答案,如果遇到困难,请添加新问题。
  • 正如你所说,我已经上传了新问题。请看一下stackoverflow.com/questions/33777061/…
猜你喜欢
  • 2014-10-10
  • 2016-05-30
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多