Json 如何在控制器中调用web api并返回视图MVC4

Json 如何在控制器中调用web api并返回视图MVC4,json,asp.net-mvc-4,asp.net-web-api,client,getjson,Json,Asp.net Mvc 4,Asp.net Web Api,Client,Getjson,我有一个使用MVC4的项目,我想问一下如何从webapi获取数据并返回视图 型号 public class Name { public Int32 NameId { get; set; } public String FirstName{ get; set; } public String LastName{ get; set; } public String CreatedBy { get; set; } } public class IListMyProje

我有一个使用MVC4的项目,我想问一下如何从webapi获取数据并返回视图

型号

public class Name
{
    public Int32 NameId { get; set; }
    public String FirstName{ get; set; }
    public String LastName{ get; set; }
    public String CreatedBy { get; set; }
}

public class IListMyProject
{
    public List<Name> Names { get; set; }
}
我可以返回我的观点。现在我有了另一个名为Details.cshtml的视图,其中包含以下代码:

 public ActionResult Details(string id)
    {
        string securityToken = repo.GetTokens();
        if (securityToken != null)
        {
            HttpClient client = new HttpClient();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "webapiurl/api/Name/GetById/"+id+"");
            string authHeader = System.Net.HttpRequestHeader.Authorization.ToString();
            httpRequestMessage.Headers.Add(authHeader, string.Format("JWT {0}", securityToken));

            var response = client.SendAsync(httpRequestMessage)
                .ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode())
                .Result;
            if (response.IsSuccessStatusCode)
            {

                model.Names = response.Content.ReadAsAsync<IList<Name>>().Result.ToList();

            }
        }
        return View(model);
    }
当我运行它时,会出现以下错误:

 Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.IList`1[Models.Name]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.

 To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.

 Path 'NameId', line 1, position 10.
无法将当前JSON对象(例如{“name”:“value”})反序列化为类型“System.Collections.Generic.IList`1[Models.name]”,因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。
若要修复此错误,请将JSON更改为JSON数组(例如[1,2,3]),或更改反序列化类型,使其成为可以从JSON对象反序列化的正常.NET类型(例如,不是integer之类的基元类型,也不是数组或列表之类的集合类型)。还可以将JsonObjectAttribute添加到类型中,以强制它从JSON对象反序列化。
路径“NameId”,第1行,位置10。
我是webapi新手,如何解决这个问题。我想知道为什么我要列出所有(对于索引,我使用api/get)它可以工作,但当我想详细显示它时,它就不工作了

谢谢你的帮助

问候

编辑

当我在中调试时

 model.Names = response.Content.ReadAsAsync<IList<Name>>().Result.ToList();
model.Names=response.Content.ReadAsAsync().Result.ToList();
它说空,当我试图获得响应时是否有什么问题?

问题在于:

{
  "NameId": 1,
  "FirstName": "This is First Name",
  "LastName": "This is Last Name",
  "CreatedBy": "This is Created By"
}
无法反序列化为IList。上面的JSON只是一个名称,而不是名称的集合。因此,Json.NET反序列化将失败

确保WebAPI控制器返回IList,或者更改MVC代码以将内容作为单个名称读取。JSON中的名称集合将改为如下所示:

[{
  "NameId": 1,
  "FirstName": "This is First Name",
  "LastName": "This is Last Name",
  "CreatedBy": "This is Created By"
},
{
  "NameId": 2,
  "FirstName": "This is First Name",
  "LastName": "This is Last Name",
  "CreatedBy": "This is Created By"
}]

Web API返回的对象类型为Name,而不是Name的集合。我看不出您在哪里定义模型。我添加了类型名称的定义。试试这个

public ActionResult Details(string id)
{
    string securityToken = repo.GetTokens();
    Name model;
    if (securityToken != null)
    {
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "webapiurl/api/Name/GetById/"+id+"");
        string authHeader = System.Net.HttpRequestHeader.Authorization.ToString();
        httpRequestMessage.Headers.Add(authHeader, string.Format("JWT {0}", securityToken));

        var response = client.SendAsync(httpRequestMessage)
            .ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode())
            .Result;
        if (response.IsSuccessStatusCode)
        {

            model = response.Content.ReadAsAsync<Name>();

        }
    }
    return  View(model);
}
公共操作结果详细信息(字符串id)
{
string securityToken=repo.GetTokens();
名称模型;
if(securityToken!=null)
{
HttpClient=新的HttpClient();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
HttpRequestMessage HttpRequestMessage=新的HttpRequestMessage(HttpMethod.Get,“webapiurl/api/Name/GetById/”+id+”);
字符串authHeader=System.Net.HttpRequestHeader.Authorization.ToString();
httpRequestMessage.Headers.Add(authHeader,string.Format(“JWT{0}”,securityToken));
var response=client.sendaync(httpRequestMessage)
.ContinueWith((postTask)=>postTask.Result.EnsureAccessStatusCode())
.结果;
if(响应。IsSuccessStatusCode)
{
model=response.Content.ReadAsAsync();
}
}
返回视图(模型);
}

问题似乎在于,当您以
IList
读取结果时,JSON只返回1条记录。将其更改为simply
Name
可以解决问题

然而,您的问题是:“如何在控制器中调用web api并返回视图MVC4

我建议您看看您可以将代码简化为:

public ActionResult Details(string id)
{
    string securityToken = repo.GetTokens();
    Name model;
    if (securityToken != null)
    {
        var client = new RestClient("");

        var request = new RestRequest("webapiurl/api/Name/GetById/"+id, HttpMethod.Get);
        string authHeader = System.Net.HttpRequestHeader.Authorization.ToString();
        request.AddHeader(authHeader, string.Format("JWT {0}", securityToken));

        var model = client.Execute<Name>(request);
    }
    return  View(model);
}
公共操作结果详细信息(字符串id)
{
string securityToken=repo.GetTokens();
名称模型;
if(securityToken!=null)
{
var client=new RestClient(“”);
var request=new RestRequest(“webapiurl/api/Name/GetById/”+id,HttpMethod.Get);
字符串authHeader=System.Net.HttpRequestHeader.Authorization.ToString();
AddHeader(authHeader,string.Format(“JWT{0}”,securityToken));
var model=client.Execute(请求);
}
返回视图(模型);
}

我想这是我的问题。但是我没有制作webapi,我只是在我的mvc中使用它。如何列出json?感谢browell,然后将内容作为名称读取,如果您不控制web服务,则不作为IList读取……我使用var NamesId=response.content.ReadAsAsync().Result;当我在NamesId上调试时,我可以得到结果。但是我怎样才能返回到Details.cshtml视图呢?您好,我尝试了这个,结果是“value不能为null”。对不起,我没有理解原来的问题。看看我最新的答案,看看是否有帮助。
public ActionResult Details(string id)
{
    string securityToken = repo.GetTokens();
    Name model;
    if (securityToken != null)
    {
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "webapiurl/api/Name/GetById/"+id+"");
        string authHeader = System.Net.HttpRequestHeader.Authorization.ToString();
        httpRequestMessage.Headers.Add(authHeader, string.Format("JWT {0}", securityToken));

        var response = client.SendAsync(httpRequestMessage)
            .ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode())
            .Result;
        if (response.IsSuccessStatusCode)
        {

            model = response.Content.ReadAsAsync<Name>();

        }
    }
    return  View(model);
}
public ActionResult Details(string id)
{
    string securityToken = repo.GetTokens();
    Name model;
    if (securityToken != null)
    {
        var client = new RestClient("");

        var request = new RestRequest("webapiurl/api/Name/GetById/"+id, HttpMethod.Get);
        string authHeader = System.Net.HttpRequestHeader.Authorization.ToString();
        request.AddHeader(authHeader, string.Format("JWT {0}", securityToken));

        var model = client.Execute<Name>(request);
    }
    return  View(model);
}