6

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; }
}

Index.cshtmlこのコードを使用してすべてをリストできます

public ActionResult Index()
    {
        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/Get?$orderby=LastName&$top=10");
            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("Index", model);
    }

私は自分の見解を返すことができます。そして今、私はこのコードで 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);
    }

この詳細では、私の Json は次のようになります。

 application/json, text/json
 {
  "NameId": 1,
  "FirstName": "This is First Name",
  "LastName": "This is Last Name",
  "CreatedBy": "This is Created By"
 }

実行すると、次のエラーが発生します。

 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.

これを修正するにはどうすればよいですか。webapi は初めてです。すべてをリストすると(インデックスの場合はapi/getを使用)、なぜ機能するのだろうかと思いますが、詳細に表示したい場合は機能しません。

助けてくれてありがとう

よろしく

編集

デバッグするとき

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

Nullと表示されています。応答を取得しようとすると何か問題がありますか?

4

3 に答える 3

3

問題は次のとおりです。

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

IList として逆シリアル化することはできません。上記の JSON は 1 つの名前であり、名前のコレクションではありません。したがって、Json.NET の逆シリアル化は失敗します。

Web API コントローラーが 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"
}]
于 2013-02-09T04:32:31.047 に答える
1

問題は、結果をIList<Name>. それを単純に変更するとName、問題が解決するはずです。

ただし、質問は次のとおりです。「コントローラーでWeb APIを呼び出してビューMVC4に戻る方法

http://restsharp.org/を見ることをお勧めします。コードを次のように単純化できます。

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);
}
于 2013-02-18T16:25:33.803 に答える
1

Web API は、 Nameのコレクションではなく、Name型の単一のオブジェクトを返しています。modelを定義する場所がわかりません。タイプ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);
}
于 2013-02-12T13:53:38.970 に答える