Xamarin表单,在尝试打开webhttp-link时出错

时间:2016-04-05 04:24:19

标签: c# xamarin xamarin.forms

在这个例子中,我打开一个看起来像这样的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.

    };

}

4 个答案:

答案 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)

  1. 您可以查看事件通话中实际获得的字符串吗?
  2. 每次尝试在循环内创建一个新变量。而不是使用外部字符串变量。
  3. 原因:你在你的周期中创建了多个闭包,但是你为这个东西使用了一个全局不可变变量(你的 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)); };
    }