在这个例子中,我打开一个看起来像这样的http地址:http://www.url.com/,我收到一个错误:
无效的URI:无法确定URI的格式。
这是我正在使用的代码。如果用户提出了糟糕的地址,例如htp:/没有两个地址,我怎么能避免崩溃呢?
这是我的代码:
foreach (var currentItem in getInfofromDB["results"]) {
URLstring = currentItem ["url"].ToString ();
URLButton.Clicked += (object sender, EventArgs e) => {
Device.OpenUri(new Uri(URLstring)); //Invalid URI: The format of the URI could not be determined.
};
}
答案 0 :(得分:0)
您可以使用TryCreate
创建有效的Uri
。
MSDN
创建一个新的Uri。如果Uri不能,则不会抛出异常 创建
Uri = outvalue;
if(Uri.TryCreate("http://www.google.com", UriKind.Absolute, out outvalue))
{
//logic
}
答案 1 :(得分:0)
我认为这存在于您发布的代码之外的某处:
string URLString;
Button URLButton;
使用你的循环,你做错了几件事。
首先,您要为"结果"中的每个项目添加一个Clicked处理程序。名单。当点击按钮时,它将尝试触发所有这些按钮 - 一次一个(事件处理程序实现为多播代理)。如果其中任何一个失败,那么它将不会执行其余的。
其次,您正在Clicked处理程序中引用URLString。这意味着所有Clicked处理程序将使用相同的值执行。
第三,因为URLString是在循环之外定义的,并且你是在循环中分配它的值,这意味着一旦循环结束,它将只包含"中的最终项的值。结果"列表。
也许这里有更多的代码你还没有向我们展示 - 比如可能在循环体中声明了URLString和URLButton?但是,在您希望代码按预期工作之前,需要修复这些问题。
我已经更新了我的"清理了#34;这里是您的代码段的版本。它与您更新的代码段相同,但是在遇到错误的网址时无声地失败而不是抛出异常:
foreach (var currentItem in getInfofromDB["results"]) {
URLstring = currentItem ["url"].ToString ();
URLButton.Clicked += (object sender, EventArgs e) => {
Uri uri;
if (Uri.TryCreate(URLstring, UriKind.Absolute, out uri)) {
Device.OpenUri(uri);
}
};
}
答案 2 :(得分:0)
我们只尝试使用网址,而不使用foreach:
URLstring = getInfofromDB["results"][0]["url"].ToString ();
URLButton.Clicked += (object sender, EventArgs e) => {
Uri uri;
if (Uri.TryCreate(URLstring, UriKind.Absolute, out uri)) {
Device.OpenUri(uri);
}
};
使用foreach,您将分配URLButton事件处理程序的次数与结果数一样多。打开太多网址并不好,是吗?
答案 3 :(得分:0)
原因:你在你的周期中创建了多个闭包,但是你为这个东西使用了一个全局不可变变量(你的 URLstring 没有理由存在)。我无法想象那里发生了什么,但在事件召集时你可能会得到任何东西。
foreach (var currentItem in results)
{
var s = currentItem ["url"].ToString ();
URLButton.Clicked += (object sender, EventArgs e) => {
Debug.WriteLine(s);
Device.OpenUri(new Uri(s)); };
}