Отображение ответа JSON в виде списка C # MVC

#c# #json #layout #ienumerable

#c# #json #макет #ienumerable

Вопрос:

Я новичок в C #, Android был моим прошлым. Извините, если я неправильно объясняю или не понимаю.
Пытаюсь выяснить, как отобразить более одного из моих ответов JSON в представлении. Вот мой класс для работы с shtml:

  public class ArtistInformation : IEnumerable
{
    [Display(Name = "Song Title:")]
    public string Name { get; set; }

    [Display(Name = "Album Title:")]
    public string Album { get; set; }

    [DataType(DataType.Url)]
    public string Image { get; set; }
}
 

shtml:

  <div class="form-group col-md-offset-3 col-md-5">

        <h2>Forecast for the selected city</h2>

        <label asp-for="Name"></label>
        <span class="badge">@Model.Name</span>
        <br />

        <label asp-for="Album"></label>
        <span class="badge">@Model.Album</span>
        <br />

        <label asp-for="Image"></label>
        <div class="display-field">
            <img src="@Url.Content(Model.Image)/>"

        <br />
    </div>
 

Вот мой контроллер, в котором я жестко запрограммировал первую позицию для отображения, чтобы убедиться, что она работает:

  public IActionResult ArtistInformation(string artistName)
    {
        ArtistInfoResponse artistResponse = _musicRepository.GetArtistResponse(artistName);
        ArtistInformation viewModel = new ArtistInformation();
        
        if (artistResponse != null)
        {
            viewModel.Name = artistResponse.Data[1].Title;
            viewModel.Album = artistResponse.Data[1].Album.Title;
            viewModel.Image = artistResponse.Data[1].Album.Cover;

        }
        return View(viewModel);
    }
 

Теперь я хочу повторить это представление со всем моим ответом. Я прочитал об IEnumerable, но не могу понять, как применить, если это то, что мне нужно.

Здесь я использую RestSharp для получения ответа JSON:

 ArtistInfoResponse IMusicRepository.GetArtistResponse(string artistName)
    {
        artistName = (char)34   artistName   (char)34;  //ensure the string is wa
        RestClient client = new RestClient($"https://api.deezer.com/search?q=artist:{artistName}");
        RestRequest request = new RestRequest(Method.GET);
        IRestResponse response = client.Execute(request);

        if (response.IsSuccessful)
        {
            // Deserialize the string content into JToken object
           // var content = JsonConvert.DeserializeObject<JToken>(response.Content);
            var content = JsonConvert.DeserializeObject<IEnumerable<ArtistInfoResponse>>(response.Content);
            // Deserialize the JToken object into our ArtistInfoResponse Class
            return content.ToObject<ArtistInfoResponse>();  // this line doesn't work now
        }

        return null;
    }
}
 

РЕДАКТИРОВАТЬ ДОБАВЛЕНИЕ КЛАССА****************************

  public class ArtistInfoResponse : IEnumerable
{
    public SongInfo[] Data { get; set; }
    public int Total { get; set; }
    public string Next { get; set; }

    public IEnumerator GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

public class SongInfo
{
    public int Id { get; set; }
    public bool Readable { get; set; }
    public string Title { get; set; }
    public string Title_short { get; set; }
    public string Title_version { get; set; }
    public string Link { get; set; }
    public int Duration { get; set; }
    public int Rank { get; set; }
    public bool Explicit_lyrics { get; set; }
    public int Explicit_content_lyrics { get; set; }
    public int Explicit_content_cover { get; set; }
    public string Preview { get; set; }
    public string Md5_image { get; set; }
    public Artist Artist { get; set; }
    public Album Album { get; set; }
    public string Type { get; set; }
}

public class Artist
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Link { get; set; }
    public string Picture { get; set; }
    public string Picture_small { get; set; }
    public string Picture_medium { get; set; }
    public string Picture_big { get; set; }
    public string Picture_xl { get; set; }
    public string Tracklist { get; set; }
    public string Type { get; set; }
}

public class Album
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Cover { get; set; }
    public string Cover_small { get; set; }
    public string Cover_medium { get; set; }
    public string Cover_big { get; set; }
    public string Cover_xl { get; set; }
    public string Md5_image { get; set; }
    public string Tracklist { get; set; }
    public string Type { get; set; }
}
 

}

Комментарии:

1. Можете ли вы поделиться своим классом ArtistInfoResponse.


Ответ №1:

Вы должны перебирать свои данные, потому что это список.

 @foreach (var item in Model)
{
    <div>@item.Name</div>
    <div>@item.Album</div>
}
 

Ответ №2:

В итоге я избавился от представлений классов для заполнения shtml, поскольку, полагаю, я не до конца понимаю эту инфраструктуру. Я также удалил IEnumerable для самого сериализованного объекта, который является IEnumerable (я думаю). Теперь у меня есть shtml, подобный этому:

 @model MyMusicApp.Models.ArtistInfoResponse
 

@{
ViewData[«Title»] = «Информация об исполнителе»;
}

 <div class="container">

    <div class="form-group col-md-offset-3 col-md-5">

        <h2>Song Titles and Albums for @Model.Data[1].Artist.Name</h2>

        @foreach (var item in Model.Data)
        {
            <span class="badge">@item.Title</span>
            <br />

            <span class="badge">@item.Album.Title</span>
            <br />

            <img src="@Url.Content(item.Album.Cover)" />
            <hr />
        }

    </div>

</div>

<div class="container">

    <div class="form-group col-md-offset-3 col-md-5">

        <form method="get">
            <button asp-controller="Home" asp-action="SearchArtist" class="btn btn-success">Return</button>
        </form>
 

И заполнить его, передав его из контроллера в представление:

  public IActionResult ArtistInformation(string artistName)
    {
        ArtistInfoResponse artistResponse = _musicRepository.GetArtistResponse(artistName);
       
        return View(artistResponse);
    }
 

Мой клиент у меня в отдельном классе, где он содержит GetArtistResponse:

 ArtistInfoResponse IMusicRepository.GetArtistResponse(string artistName)
    {
        artistName = (char)34   artistName   (char)34;
        var client = new RestClient($"https://api.deezer.com/search?q=artist:{artistName}");

        var request = new RestRequest(Method.GET);
        IRestResponse response = client.Execute(request);

        if (response.IsSuccessful)
        {
            // Deserialize the string content into JToken object
            var content = JsonConvert.DeserializeObject<JToken>(response.Content);

            // Deserialize the JToken object into our ArtistInfoResponse Class
            return content.ToObject<ArtistInfoResponse>();
        }

        return null;
    }
}
 

}