在MVC控制器中从JsonResult方法返回JSON

15

我正在尝试在一个测试的ASP.NET MVC3应用程序中填充ComboBox(Telerik RAD ComboBox)。

我已经在我的ASPX页面上定义了ComboBox,在控制器中定义了返回JsonResult的操作调用。

我遇到的问题是,我使用的Web服务已经将结果集作为JSON字符串返回。我该如何直接传递来自Web服务的响应。

以下是代码片段:ASPX页面:

<% Html.Telerik().ComboBox()
                       .Name("cbRefTables")
                       .DataBinding(b => b
                           .Ajax()
                           .Select("GetCALMdata","Common")                    
                       )
                       .Render();
                %>

控制器:叫做CommomController

    public JsonResult GetCALMdata()
    {
        CALMwsP.wsCALMSoapClient wsC = new CALMwsP.wsCALMSoapClient("wsCALMSoap");
        string resultset = wsC.GetRefTables("P_1", "P_2", "P_3", "P_4");

        return ??; -- I want to return resultset which is already formatted. 
    }
5个回答

27

如果使用ASP.NET MVC 2或更高版本:

return Json(resultset, JsonRequestBehavior.AllowGet);

这就是我最初拥有的,但是我收到了以下错误:Microsoft JScript运行时错误:'Selected'为null或不是对象。 - MAB
1
好的,那个错误不是来自控制器。所以你的问题在于你如何处理JSON。 - Mike Brind
很可能错误来自于组合框,它不知道默认选择的项目应该是什么。 - curtisk
3
使用参考是什么? - Serj Sagan

20
如果resultset字符串已经是JSON格式(没有被包装在任何XML中),那么你应该返回一个ContentResult,并将该字符串作为内容返回:
public ContentResult GetCALMdata()
{
    CALMwsP.wsCALMSoapClient wsC = new CALMwsP.wsCALMSoapClient("wsCALMSoap");
    string resultset = wsC.GetRefTables("P_1", "P_2", "P_3", "P_4");

    return Content(resultset, "application/json");
}

在这种情况下,您不希望使用JsonResultJson()助手,因为这样会重新序列化您的JSON。


设置额外的contentType参数为application/json是我所需要的。我使用Newtonsoft.Json进行Json序列化,而不是内置的序列化器,因为我想要一些它可以做的序列化自定义。 - Matt Kemp

5
如果我理解正确,您应该使用Json()方法。
return Json(resultset);

9
使用参考是什么? - Serj Sagan

1

个人的Json方法:

return Json(resultset);

它需要 System.Web.Http DLL,命名空间为 System.Web.Http.Results.

enter image description here


在WebApiConfig.cs中加入以下代码即可在整个网站上使用:
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

  • 用于包含 DLL 名称和命名空间。
- FrenkyB

1
在MVC 5及以下版本中,您可以像这样操作:
            var dict = new Dictionary<string, string>
            {
                { "name", "Foobar" },
                { "url", "admin@foobar.com" }
            };

            var json = new JsonResult()
            {
                Data = dict
            };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接