2016-04-05 6 views
0

を開こうとすると、私はこのように見ているのhttpアドレスを開きます。http://www.url.com/と私のエラーを受け取る:Xamarinフォーム、エラーこの例ではwebhttpリンク

Invalid URI: The format of the URI could not be determined.

は、これは私が使用していたコードです。そして、ユーザーが2tなしで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

正確な形式は「URLstring」 – SushiHangover

+0

通常空です。文字列URLstring; – medvedo

+0

私はコンストラクタで使用している実際のURI非エンコードのテキストを意味しましたが、私は以下の答えを使用して、 'TryCreate'を使用してあなたのURIフォーマットに間違いがないか調べます。 – SushiHangover

答えて

0
  1. イベントコール内で実際にどの文字列を確認できますか?
  2. サイクルごとに新しい変数を作成してみてください。外部の文字列変数を使用する代わりに。

理由:あなたのサイクルで複数のクロージャを作成しているが、あなたはこの事のために一つのグローバル不変変数を使用します(あなたの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)); }; 
} 
+0

これは私のコードと同じですが、文字列の代わりにvarを使用していますか?小さな変化はそれを修正するだろうか? – medvedo

+0

違いは、URLstring変数が定義されている場所です。私の変数はすべてのサイクルで新たに定義され、新しいクロージャです。あなたのケースでは、すべてのクロージャで同じ変数を取得する可能性があります(コンパイラによって異なります) –

0

あなたはTryCreateを使用して、有効なUriを作成することができます。

MSDN

Creates a new Uri. Does not throw an exception if the Uri cannot be created.

Uri = outvalue; 

if(Uri.TryCreate("http://www.google.com", UriKind.Absolute, out outvalue)) 
{ 
    //logic 
} 
+0

ここでは、私は決してif文の中の関数に到達しません。このコードの – medvedo

+0

:Uri outvalue; \t \t \t \t \t \t \t 'IF(アウトoutvalue Uri.TryCreate(urlString、UriKind.Absolute)) \t \t \t \t \t \t \t { \t \t \t \t \t \t \t \t Device.OpenUri(outvalue) ; \t \t \t \t \t \t \t \t System.Diagnostics.Debug.WriteLine( "リーチ");それが動作するはずです \t \t \t \t \t \t \t} ' – medvedo

+0

、私はそれを持っていますが、私のclickfunctionの内側と私はから読み込むものとHTTPグーグル削除この[例](https://dotnetfiddle.net/5nTodx) –

0

私は、これはどこかにあなたの投稿コードの外に存在すると仮定します。あなたのループで

string URLString; 
Button URLButton; 

、あなたは間違っていくつかのことをやっています。

まず、 "結果"リストの各項目にClickedハンドラを追加します。ボタンをタップすると、一度に1つずつ(イベントハンドラはマルチキャストデリゲートとして実装されます)、すべてのイベントを起動しようとします。それらのANYが失敗すると、残りのものは実行されません。

次に、Clickedハンドラ内からURLStringを参照しています。これは、すべてのクリックされたハンドラが同じ値を使用して実行されることを意味します。

第3に、URLStringはループ外で定義されており、ループ内からその値を割り当てているため、ループが終了すると、結果セットの最後の項目の値のみを持ちます。リスト。

おそらく、URLStringとURLButtonが実際にループ本体内で宣言されているように、私たちが表示していないコードがいくつかありますか?しかし、これらの問題は、コードが意図したとおりに動作することを期待する前に修正する必要があります。

ここでコードスニペットの「クリーンアップ」バージョンを更新しました。それはあなたの更新スニペットと同じであるが、代わりに悪いURLを打ったときに例外をスローで静かに失敗します。

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); 
     } 
    }; 
} 
+0

はクラッシュしませんが、その文の中の関数に到達することはありません – medvedo

+0

foreachループ内でクリックされた関数を持っていますbtw – medvedo

+0

次のコメントに基づいて回答を更新しました。あなたはいくつかのことを間違っていますが、あなたがまだ示していないより多くのコードが関わっている可能性がありますか? –

0

はのは、foreachのなしで、唯一のURLを試してみましょう:

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イベントハンドラを割り当てます。あまりにも多くのURLを開くのは良いことではありませんか?

関連する問題