【问题标题】:MVC Controller return Content instead of JSONMVC 控制器返回内容而不是 JSON
【发布时间】:2013-04-05 19:10:02
【问题描述】:

我一直在做一个项目,我的所有需求都涉及 JSON。但是现在突然我需要从我的模型中返回可以在输入元素值字段中使用的结果。我无法使用我一直使用的解决方案,因为我得到了返回的对象而不是值的纯文本。这是我一直在使用的控制器模式:

public virtual JsonResult fooData()
{
    var fooresults = new fooQueries().fooTotal();
    return new JsonResult 
        { JsonRequestBehavior = JsonRequestBehavior.AllowGet, Data = fooresults };
}

有没有办法使用返回内容而不是 JsonResult?我对 .NET MVC 框架还很陌生,很难找到正确的方法。

我当前的结果格式如下:

[{ "foo", 3 }]

相反,我更喜欢获取纯文本,以便可以使用 AJAX 请求将 3 值传递到输入元素 value="" 字段。

我与控制器一起使用的 AJAX 调用:

$.ajax({
    type: 'GET',
    url: $('#fooValue').data('url'),
    success: function (data) {
        $('#fooValue').val(data);
    }
});

data-url 相当于:

../fooController/fooData

我只是在使用 T4MVC。

【问题讨论】:

  • 为什么不能从反序列化的 json 的 foo 属性中设置输入值?
  • 也许是一个例子?我在 JSON 的新领域。这听起来可能是一个更好的解决方案,但参考或示例会有所帮助。谢谢。
  • 大概您使用 AJAX 来调用返回 JSON 的控制器操作?你是在使用 jQuery 来执行 AJAX 调用吗?
  • 我正在使用 AJAX,我将在上面添加它。

标签: asp.net-mvc json model controller


【解决方案1】:

返回 ContentResult 而不是 JsonResult

public virtual ContentResult gooData()
{
    var fooresults = new fooQueries().fooTotal();
    return Content(fooresults);
}

【讨论】:

    【解决方案2】:

    您可以将内容返回为:

    return Content(fooresults);
    

    但这不会像 JSON 返回那样将元素分开。

    【讨论】:

      【解决方案3】:

      我不确定fooresults 的形状是什么,但您应该能够将您的 AJAX 调用更改为以下内容:

      $.ajax({
         type: 'GET',
         url: $('#fooValue').data('url'),
         success: function (data) {
          $('#fooValue').val(data.foo);
         }
      });
      

      如果未明确设置 jQuery ajax 调用的 dataType 属性,则 jQuery 将尝试根据 MIME 类型推断返回结果的类型,在您的情况下为 JSON。因此 jQuery 会将 JSON 反序列化为 JSON 对象。请参阅http://api.jquery.com/jQuery.ajax/ 了解更多信息。

      【讨论】:

      • 我会试试这个。我猜想在 JQuery API 的某个地方我可以找到如何使用 .serialize 等,如果我需要将其转换为纯文本类型?目前输出是一个 JSON 对象,所以它看起来像 value="[Object object]" 我可以改变它吗?谢谢。
      • 要显式序列化和反序列化 JSON,请分别使用 JSON.stringify 和 JSON.parse。所有现代浏览器都原生支持它们,但无论如何建议使用 JSON-js 库 (github.com/douglascrockford/JSON-js),因为如果这些功能不可用,它将增加对旧浏览器的支持。
      • 我猜这会“更好”。我将其更改为 .val(data.PlainObject) 但是现在我只是得到 value="" 所以我没有得到 [Object, object] 很好,但是现在没有任何东西通过。有什么想法吗?
      • 为什么是.PlainObject?它应该是您从操作返回的类型的属性名称。事实上,看起来您正在返回一个集合类型 (fooResults)?那么如何知道要使用集合值中的哪个元素呢?
      • 返回的结果只有一个“集”,其格式为 [{“value”, 4 }],我只是想将 4 传递给 value=""。如果包含“价值”部分,那不是问题。
      【解决方案4】:

      要返回一个Json,方法应该改变如下:

      public JsonResult fooData()
      {
          var fooresults = new fooQueries().fooTotal();
          return  Json(fooresults , JsonRequestBehavior.AllowGet);    
      }
      

      【讨论】:

        猜你喜欢
        • 2014-11-16
        • 1970-01-01
        • 2017-12-30
        • 1970-01-01
        • 1970-01-01
        • 2013-07-24
        • 2022-01-15
        • 1970-01-01
        • 2017-01-17
        相关资源
        最近更新 更多