【问题标题】:Return JSON via MVC controller vs webmethod通过 MVC 控制器与 webmethod 返回 JSON
【发布时间】:2017-05-15 15:19:02
【问题描述】:

我正在尝试将带有许多代码隐藏 webmethod 函数的 Web 表单页面转换为带有控制器的 MVC 视图。

我返回的数据不同。他们已正确格式化 JSON,但 web 方法返回 JSON 如下:

{"d":"{\"Success\":true,\"Data\":{\"QuoteId\":340439,\"LoginId\":40,

控制器返回:

"{\"QuoteId\":340444,\"LoginId\":40,

它没有将它包装在 data.d 中,就像它设置为在 javascript 中处理一样,并且没有 SuccessData 对象。当我尝试解析它 ($.parseJSON(data)) 时,就像我对 webmethod 所做的那样,它在第 1 行消息中给出了旧错误。

我敢肯定,如果我使用它足够多,我可以让它与数据通过的方式一起工作,但我有很多页面需要在未来隐藏,我只是想知道是否有是一种让控制器像webmethod 那样格式化它的简单方法。

我很确定我知道为什么数据的格式不同,但如果我能以相同的方式返回数据,那会让我的生活更轻松。我试过返回一个JsonConvert.SerializeObject(obj),它只是一个字符串,还有一个Return Json(obj),我猜它也只是一个字符串,但它们都以相同的非data.d方式返回东西。

【问题讨论】:

  • 那么,如果您希望它返回之前返回的相同 JSON,为什么不创建一个新对象来包装您的响应呢? public class JsonResponseWrapper { public bool Success {get; set;} public object Data {get; set;} } 类似的东西。
  • @mason 我一直在尝试这样做,但由于某种原因,它的数据格式并不相同。我可以让它基本上“看起来”相同,但它会在 webmethod 没有的 JS 中抛出错误。

标签: asp.net asp.net-mvc webforms webmethod jsonresult


【解决方案1】:

好的,所以我决定将数据包装在“d”中,以便在 Ajax 结果中包含“data.d”。

但由于某种原因,当我通过以下方式发回数据时,日期的格式不正确:

return Json(thewrappeddata);

他们变得很奇怪。

所以基本上我要做的是:

public class JSONReturn {
    public object d;
    public static object Wrap(object data) {
        return new JSONReturn() { d = data };
    }
}

var thedata = new TonsofData();

return Json(
    JSONReturn.Wrap(
       JsonConvert.SerializeObject(thedata, 
           new JsonSerializerSettings { 
              ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore 
           }
       )
   )
);

似乎我在这里“jsonifying”了两次数据,一次是JsonConvert.SerializeObject(),一次是Json()(我认为是序列化的),但它似乎有效,现在我得到了我需要的东西和所有JS 就像以前一样工作。如果我省略了JsonConvert.SerializeObject()Json() 会错误地格式化日期,并导致各种失败。

【讨论】:

    猜你喜欢
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多