导航上下文返回不完整的数据

本文关键字:数据 上下文 返回 导航 | 更新日期: 2023-09-27 18:33:48

我有一个代码,我在其中将电子邮件数据传递到另一个页面。电子邮件正文可能包含 HTML。

在第二页上,我观察到当"&"或"#"等进入正文内容时(从NavigationContext.QueryString.TryGetValue()获取数据时),字符串中断和进一步的数据不会获得。

第一页上用于发送数据的代码:

string strParameters = string.Empty;
strParameters += "subject=" + objEmail.Subject;
strParameters += "&from=" + objEmail.FromAddress;
strParameters += "&to=";
for (int i = 0; i < objEmail.NumTo; i++)
{
     strParameters += objEmail.GetToAddr(i) + "; ";
}
strParameters += "&cc=";
for (int i = 0; i < objEmail.NumCC; i++)
{
    strParameters += objEmail.GetCcAddr(i) + "; ";
}
strParameters += "&body=" + objEmail.Body;
NavigationService.Navigate(new Uri("/PageReadMail.xaml?" + strParameters, UriKind.Relative));

第二页上用于接收数据的代码:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    string strOriginalString = e.Uri.OriginalString;
    //get data received from navigation service
    string strBody = "";
    string strSubject = "";
    string strTo = "";
    string strCc = "";
    string strFrom = "";
    NavigationContext.QueryString.TryGetValue("body", out strBody);
    NavigationContext.QueryString.TryGetValue("subject", out strSubject);
    NavigationContext.QueryString.TryGetValue("from", out strFrom);
    NavigationContext.QueryString.TryGetValue("to", out strTo);
    NavigationContext.QueryString.TryGetValue("cc", out strCc);
}

在这里,strBody的数据不完整。

导航上下文返回不完整的数据

参数应为 URL 编码

应在 URI 的每个参数上使用HttpUtility.UrlEncode()Uri.EscapeDataString()。或者,可以对整个 Uri 使用Uri.EscapeUriString()

Uri 的长度有限制

也许您的字符串更长并且正在修剪?虽然,我认为如果它更长,它只会抛出一个异常,而不是修剪它,但你应该检查一下。

最好将整个电子邮件对象传递给PageReadMail

我认为将整个电子邮件对象传递到页面会更容易、更安全,而不是将其转换为字符串并在 Uri 中传递。

只需将类型为 YourEmailObjectType 的静态属性添加到 PageReadMail 类,并在导航到页面之前设置该属性。导航后,从该属性(而不是导航 Uri)获取电子邮件的数据。

您可以只替换字符("&"和"#"):

strParameters += "&body=" + objEmail.Body.Replace("&", "%26").Replace("#", "%23");