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