C# 如何在导航到其他页面时使用反序列化对象?
所以基本上我有一个按钮。当我点击它时,必须发生两件事 1) 获取数据的web请求 2) 导航到其他页面并填充数据 问题是,当应用程序导航到第2页时,app.mydirectories会给出一个nullreferenceException 如何确保App.mydirectories不为null,并在将数据填充到新页面之前等待C# 如何在导航到其他页面时使用反序列化对象?,c#,windows-phone-8,json-deserialization,C#,Windows Phone 8,Json Deserialization,所以基本上我有一个按钮。当我点击它时,必须发生两件事 1) 获取数据的web请求 2) 导航到其他页面并填充数据 问题是,当应用程序导航到第2页时,app.mydirectories会给出一个nullreferenceException 如何确保App.mydirectories不为null,并在将数据填充到新页面之前等待 private void Button_Click(object sender, RoutedEventArgs e) { makeE
private void Button_Click(object sender, RoutedEventArgs e)
{
makeEventwebRequest(number.Text,date.Text);
NavigationService.Navigate(new Uri("/page2.xaml", UriKind.Relative));
}
public void makeEventwebRequest(string numb, string date)
{
string requesturi = string.Format(baseUri, numb, date);
try
{
WebClient client = new WebClient();
client.DownloadStringCompleted +=
new DownloadStringCompletedEventHandler(directories_DownloadStringCallback);
client.DownloadStringAsync(new Uri(requesturi));
}
catch (Exception e)
{
}
}
private void directories_DownloadStringCallback(object sender, DownloadStringCompletedEventArgs e)
{
App.mydirectories = JsonConvert.DeserializeObject<directoriescs>(e.Result);
}
private void按钮\u单击(对象发送者,路由目标)
{
makeEventwebRequest(number.Text、date.Text);
NavigationService.Navigate(新Uri(“/page2.xaml”,UriKind.Relative));
}
public void makeEventwebRequest(字符串numb,字符串date)
{
stringrequesturi=string.Format(baseUri,numb,date);
尝试
{
WebClient客户端=新的WebClient();
client.DownloadStringCompleted+=
新的DownloadStringCompletedEventHandler(目录\u DownloadStringCallback);
DownloadStringAsync(新Uri(requesturi));
}
捕获(例外e)
{
}
}
私有无效目录\u DownloadStringCallback(对象发送方,DownloadStringCompletedEventArgs e)
{
App.mydirectories=JsonConvert.DeserializeObject(e.Result);
}
发生此错误是因为执行WebRequest的代码是异步的。当您导航到page2.xaml时,您的数据尚未下载
这是一个关于如何编写代码的示例:
private async void Button_Click(object sender, RoutedEventArgs e)
{
await makeEventwebRequest(number.Text,date.Text);
NavigationService.Navigate(new Uri("/page2.xaml", UriKind.Relative));
}
public async void makeEventwebRequest(string numb, string date)
{
string requesturi = string.Format(baseUri, numb, date);
var request = (HttpWebRequest)WebRequest.Create(requesturi );
var result = await GetHttpResponse(request);
App.mydirectories = JsonConvert.DeserializeObject<directoriescs>(result);
}
// Method helper to Http async request
public static async Task<String> GetHttpResponse(HttpWebRequest request)
{
String received = null;
try
{
using (var response = (HttpWebResponse)(await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null)))
{
using (var responseStream = response.GetResponseStream())
{
using (var sr = new StreamReader(responseStream))
{
received = await sr.ReadToEndAsync();
}
}
}
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
return received;
}
private async void按钮\u单击(对象发送方,路由目标)
{
等待makeEventwebRequest(number.Text、date.Text);
NavigationService.Navigate(新Uri(“/page2.xaml”,UriKind.Relative));
}
公共异步void makeEventwebRequest(字符串numb,字符串日期)
{
stringrequesturi=string.Format(baseUri,numb,date);
var request=(HttpWebRequest)WebRequest.Create(requesturi);
var结果=等待GetHttpResponse(请求);
App.mydirectories=JsonConvert.DeserializeObject(结果);
}
//Http异步请求的方法帮助器
公共静态异步任务GetHttpResponse(HttpWebRequest请求)
{
接收到的字符串=null;
尝试
{
使用(var response=(HttpWebResponse)(wait Task.Factory.fromsync(request.BeginGetResponse,request.EndGetResponse,null)))
{
使用(var responseStream=response.GetResponseStream())
{
使用(var sr=新的StreamReader(responseStream))
{
已接收=等待sr.ReadToEndAsync();
}
}
}
}
捕获(例外情况除外)
{
Debug.WriteLine(ex);
}
收到的报税表;
}
您应该阅读一篇关于async/await方法的文章,这样您就可以更好地理解与我的代码不同的地方
基线是您在webrequest仍在生成时导航到page2,而在我上面发布的代码中,执行会等待web请求完成,然后导航到page2。makeEventWebRequest
也需要是异步的。