Xamarin 如何根据 id 从 Rest API 加载 listView 详细信息?
Xamarin How to load listView detail from Rest API based on id?
我有列表视图。单击该项目时,它将打开详细信息页面。但是为了性能问题,在restAPI中我设置它只发送listView需要的数据。这就是为什么我想从单击的列表视图中获得对基于 api 的 id 的新请求。
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 以根据 id 获得响应,但不知道如何在 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);
}
我刚开始学习xamarin,有什么不懂的请教我
非常感谢您的帮助^_^
只需将 JSON string
反序列化为 class 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; }
}
更新: 在主线程
中更新UI
Device.BeginInvokeOnMainThread(() => {
EdtLocation.Text = result.AddressDetail;
//...
});
我有列表视图。单击该项目时,它将打开详细信息页面。但是为了性能问题,在restAPI中我设置它只发送listView需要的数据。这就是为什么我想从单击的列表视图中获得对基于 api 的 id 的新请求。
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 以根据 id 获得响应,但不知道如何在 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);
}
我刚开始学习xamarin,有什么不懂的请教我
非常感谢您的帮助^_^
只需将 JSON string
反序列化为 class 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; }
}
更新: 在主线程
中更新UI Device.BeginInvokeOnMainThread(() => {
EdtLocation.Text = result.AddressDetail;
//...
});