Xamarin Как загрузить listView детали из Rest API на основе идентификатора? - PullRequest
1 голос
/ 31 октября 2019

У меня есть просмотр списка. когда элемент нажал, он откроет страницу сведений. Но из-за проблем с производительностью в restAPI я настроил его только на отправку данных, необходимых в listView. Вот почему я хочу получить новый запрос к идентификатору, основанному на API, который я получил по нажатию на просмотр списка.

listview.xaml.cs:

        private async void OnItemSelected(object sender, ItemTappedEventArgs e)
        {
        var itemDetail = e.Item as Data.Models.ModelAttendance.Attendance;
        await Navigation.PushAsync(new ListDetailAttendPage
            (
                itemDetail.Id, itemDetail.Image, itemDetail.Created, itemDetail.AddressDetail,
                itemDetail.Note, itemDetail.Activity
            ));
        }

listViewDetail.xaml.cs

    private ObservableCollection<Data.Models.ModelAttendance.Attendance> _attendances;

    public ListDetailAttendPage (long id, byte[] image, DateTime created, string addressDetail, string note, string activity)
    {
        InitializeComponent ();

        long idItem = id;
        ImgSelfie.Source = ImageSource.FromStream(() => new MemoryStream(image));
        EntTime.Text = created.ToString();
        EdtLocation.Text = addressDetail;
        EntNote.Text = note;
        LblAction.Text = activity;

    }

    protected override void OnAppearing()
    {
        _attendances = new ObservableCollection<Data.Models.ModelAttendance.Attendance>();
        base.OnAppearing();
    }

код API, который я использую на странице просмотра списка:

    [HttpGet]
    public IActionResult GetM_ATTENDANCE()
    {
        var data = _context.M_ATTENDANCE.Select(f => new Attendance
        {
            Id = f.Id,
            Name = f.Name,
            Activity = f.Activity,
            Created = f.Created
        }).OrderByDescending(x => x.Id).ToList();

        var tempJson = new
        {
            Data = data,
            Size = data.Count
        };
        return Json(tempJson);
    }

Как я могу сделать это в xamarin.form? Я искал, но нет правильного решения. Это то, что я пробовал, но я все еще не могу получить требуемые данные:

    private ObservableCollection<Data.Models.ModelAttendance.Attendance> _attendances;
    HttpClient client = new HttpClient();

    public ListDetailAttendPage (long id, byte[] image, DateTime created, string addressDetail, string note, string activity)
    {
        InitializeComponent ();

        long idItem = id;
        ImgSelfie.Source = ImageSource.FromStream(() => new MemoryStream(image));
        EntTime.Text = created.ToString();
        EdtLocation.Text = addressDetail;
        EntNote.Text = note;
        LblAction.Text = activity;

        Task.Run(async () =>
        {
            await GetItem(idItem);
        });

    }

    async Task GetItem(long id)
    {
        HttpResponseMessage message = await client.GetAsync(string.Format("http://[url]:[port]/api/attendances/" + id));
        string jsonString = await message.Content.ReadAsStringAsync();

     //what should I do next to get the data here?

    }

    protected override void OnAppearing()
    {
        _attendances = new ObservableCollection<Data.Models.ModelAttendance.Attendance>();
        base.OnAppearing();
    }

У меня уже есть API отдыха для получения ответа на основе идентификатора, но я не знаю, использовать ли его в Xamarin:

        // GET: api/Attendances/5
    [HttpGet("{id}")]
    public async Task<IActionResult> GetAttendance(long id)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var attendance = await _context.M_ATTENDANCE.FindAsync(id);

        if (attendance == null)
        {
            return NotFound();
        }

        return Ok(attendance);
    }

Я только начал изучать ксамарин, пожалуйста, спросите меня, если мой вопрос все еще не ясен

Ваша помощь очень ценится ^ _ ^

1 Ответ

0 голосов
/ 01 ноября 2019

Просто десериализовать JSON string в класс Model

using Newtonsoft.Json;

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();


        testAsync();
    }

    public async Task testAsync() {

        string json = @"{
              'id': '123',
              'name': 'User name',
              'nik': '213123'
            }";

        Model m = JsonConvert.DeserializeObject<Model>(json);

        Console.WriteLine(m.name);
        Console.WriteLine(m.nik);

    }
}

public class Model
{
    public string id { get; set; }
    public string name { get; set; }
    public string nik { get; set; }
    public string Created { get; set; }
}

Обновление : обновить пользовательский интерфейс в главном потоке

  Device.BeginInvokeOnMainThread(() => {
                EdtLocation.Text = result.AddressDetail;
                //...
            });
...