Angularjs 将Json对象从c#返回给角度控制器

Angularjs 将Json对象从c#返回给角度控制器,angularjs,asp.net-mvc-4,c#-4.0,Angularjs,Asp.net Mvc 4,C# 4.0,我试图从一个C#WebAPI方法返回一个Json对象。我当前的c#代码创建一个IEnumerable类型,填充一个类的对象,然后将其返回给JavaScript调用。但是,它返回的是一个5元素数组,而不是一个包含5个字段的Json对象 我只想返回一个包含5个字段的Json对象,格式如下: {"domain":"localhost", "spaceName":"rz64698", etc...} 通过这种方式,在javascript中,我可以简单地访问每个字段 _domain = rzEnvP

我试图从一个C#WebAPI方法返回一个Json对象。我当前的c#代码创建一个IEnumerable类型,填充一个类的对象,然后将其返回给JavaScript调用。但是,它返回的是一个5元素数组,而不是一个包含5个字段的Json对象

我只想返回一个包含5个字段的Json对象,格式如下:

 {"domain":"localhost", "spaceName":"rz64698", etc...}
通过这种方式,在javascript中,我可以简单地访问每个字段

 _domain = rzEnvParams.domainName;
 _space = rzEnvParams.spaceName;
从c#(到我的角度服务)返回的响应对象是这个数组。这里我只展示了五个元素中的两个:

$id: "1"
$type: "RgSys.Controllers.RgController+RzEnvParameters, RgSys"
clConfig: "C:\Rz\rz64698\master\bin\cl_config.xml"
domainName: null
envName: null
port: null
spaceName: null


$id: "2"
$type: "RgSys.Controllers.RgController+RzEnvParameters, RgSys"
clConfig: "null
domainName: null
envName: null
port: null
spaceName: "rz64698"
依此类推,直到$id:“5”

下面是我目前使用javaScript访问数组的方式(它可以工作,但我觉得有一种更有效的方法):

下面是当前返回的c#代码:

   public class RzEnvParameters{
        public string clConfig;
        public string envName;
        public string spaceName;
        public string domainName;
        public string port;
    }
  [HttpGet]
    public IEnumerable<RzEnvParameters> GetRzEnv()
    {
        string clConfig =     System.Configuration.ConfigurationManager.AppSettings["ClConfig"].ToString();
        string envName = System.Configuration.ConfigurationManager.AppSettings["EnvironmentName"].ToString();
        string spaceName = System.Configuration.ConfigurationManager.AppSettings["SpaceName"].ToString();
        string domainName = System.Configuration.ConfigurationManager.AppSettings["DomainName"].ToString();
        string port = System.Configuration.ConfigurationManager.AppSettings["Port"].ToString();
        var razParams = new List<RzEnvParameters>{
            new RzEnvParameters{clConfig=clConfig},
            new RzEnvParameters{envName=envName},
            new RzEnvParameters{spaceName=spaceName},
            new RzEnvParameters{domainName=domainName},
            new RzEnvParameters{port=port}
        };


        return rzParams;
    }
公共类rzenpparameters{
公共字符串clConfig;
公共字符串名称;
公共字符串spaceName;
公共字符串域名;
公共字符串端口;
}
[HttpGet]
公共IEnumerable GetRzEnv()
{
字符串clConfig=System.Configuration.ConfigurationManager.AppSettings[“clConfig”].ToString();
字符串envName=System.Configuration.ConfigurationManager.AppSettings[“EnvironmentName”].ToString();
string spaceName=System.Configuration.ConfigurationManager.AppSettings[“spaceName”].ToString();
字符串domainName=System.Configuration.ConfigurationManager.AppSettings[“domainName”].ToString();
字符串端口=System.Configuration.ConfigurationManager.AppSettings[“端口”].ToString();
var razParams=新列表{
新RzEnvParameters{clConfig=clConfig},
新RzEnvParameters{envName=envName},
新RzEnvParameters{spaceName=spaceName},
新RzEnvParameters{domainName=domainName},
新RzEnvParameters{port=port}
};
返回rzParams;
}
一句话:我如何重构c#代码以返回Json对象,而不是一个由5个元素组成的数组

谢谢

Bob使用JSON序列化程序。这是一个与.NET,但有几个在那里。这是一个简单的代码片段,仅用于说明序列化

// your code to set your list List<RzEnvParameters>, var razParams = ...
MemoryStream stream1 = new MemoryStream();
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(List<RzEnvParameters>));
ser.WriteObject(stream1, razParams);

stream1.Position = 0;
StreamReader sr = new StreamReader(stream1);
var jsonToReturn = sr.ReadToEnd();
//设置列表的代码,var razParams=。。。
MemoryStream stream1=新的MemoryStream();
DataContractJsonSerializer ser=新的DataContractJsonSerializer(类型(列表));
ser.WriteObject(stream1,razParams);
1.位置=0;
StreamReader sr=新的StreamReader(stream1);
var jsontoreurn=sr.ReadToEnd();

也许我错了,但为什么要创建5个单独的对象,而不是一个设置了所有5个属性的对象呢

public RzEnvParameters GetRzEnv()
    {
        string clConfig =     System.Configuration.ConfigurationManager.AppSettings["ClConfig"].ToString();
        string envName = System.Configuration.ConfigurationManager.AppSettings["EnvironmentName"].ToString();
        string spaceName = System.Configuration.ConfigurationManager.AppSettings["SpaceName"].ToString();
        string domainName = System.Configuration.ConfigurationManager.AppSettings["DomainName"].ToString();
        string port = System.Configuration.ConfigurationManager.AppSettings["Port"].ToString();
        var razParams = new RzEnvParameters{clConfig=clConfig,            
                                            envName=envName,
                                            spaceName=spaceName, 
                                            domainName=domainName, 
                                            port=port        
                                           };


        return rzParams;
    }

看起来您正在返回一个RzEnvParameters列表,其中每个参数只设置了一个属性。您这样做而不只是返回一个带有所有属性集的RzEnvParameters对象,有什么原因吗

[HttpGet]
public RzEnvParameters GetRzEnv()
{
    string clConfig = System.Configuration.ConfigurationManager.AppSettings["ClConfig"].ToString();
    string envName = System.Configuration.ConfigurationManager.AppSettings["EnvironmentName"].ToString();
    string spaceName = System.Configuration.ConfigurationManager.AppSettings["SpaceName"].ToString();
    string domainName = System.Configuration.ConfigurationManager.AppSettings["DomainName"].ToString();
    string port = System.Configuration.ConfigurationManager.AppSettings["Port"].ToString();

    var razParams = new RzEnvParameters
    {
        clConfig = clConfig,
        envName = envName,
        spaceName = spaceName,
        domainName = domainName,
        port = port
    };

    return razParams;
}
这会将您的javascript更改为以下内容:

$http({
        method: 'GET',
        encoding: 'JSON',
        url: 'breeze/breeze/GetRzEnv'
    }).success(function (data, status, headers, config) {
            rzEnvParams = data;
            deferred.resolve(rzEnvParams);
            _domain = rzEnvParams.domainName;
            _port = rzEnvParams.port;
            //etc
        });                
    });

如果我正确理解了你的问题,你需要做如下的事情

[HttpGet]
public object GetRzEnv()
{
    string clConfig =     System.Configuration.ConfigurationManager.AppSettings["ClConfig"].ToString();
    string envName = System.Configuration.ConfigurationManager.AppSettings["EnvironmentName"].ToString();
    string spaceName = System.Configuration.ConfigurationManager.AppSettings["SpaceName"].ToString();
    string domainName = System.Configuration.ConfigurationManager.AppSettings["DomainName"].ToString();
    string port = System.Configuration.ConfigurationManager.AppSettings["Port"].ToString();

    var razParams = new {
        clConfig=new RzEnvParameters{clConfig=clConfig},
        envName=new RzEnvParameters{envName=envName},
        spaceName=new RzEnvParameters{spaceName=spaceName},
        domainName=new RzEnvParameters{domainName=domainName},
        port=new RzEnvParameters{port=port}
    };

    return rzParams;
}

看起来您正在返回一个RzEnvParameters列表,其中只设置了一个属性。您这样做而不只是返回一个带有所有属性集的RzEnvParameters对象,有什么原因吗?有三个很好的回答。我必须只选择一个答案,还是有办法给三个回答者打分?据我所知,你只能选择一个
[HttpGet]
public object GetRzEnv()
{
    string clConfig =     System.Configuration.ConfigurationManager.AppSettings["ClConfig"].ToString();
    string envName = System.Configuration.ConfigurationManager.AppSettings["EnvironmentName"].ToString();
    string spaceName = System.Configuration.ConfigurationManager.AppSettings["SpaceName"].ToString();
    string domainName = System.Configuration.ConfigurationManager.AppSettings["DomainName"].ToString();
    string port = System.Configuration.ConfigurationManager.AppSettings["Port"].ToString();

    var razParams = new {
        clConfig=new RzEnvParameters{clConfig=clConfig},
        envName=new RzEnvParameters{envName=envName},
        spaceName=new RzEnvParameters{spaceName=spaceName},
        domainName=new RzEnvParameters{domainName=domainName},
        port=new RzEnvParameters{port=port}
    };

    return rzParams;
}