Blazor external link nyitása új tabra
2022-09-21T18:28:03+02:00
2022-09-22T22:46:51+02:00
2022-09-22T23:05:49+02:00
FBS
Egy blazor WASM programban szeretnék egy adott url-en található PDF oldalt megmutatni egy új böngésző fülön.

Két módszert is próbáltam.

NavManager.NavigateTo(url, true); await jsRuntime.InvokeAsync<string>("open", url, "_blank");
A NavigateTo a SPA alkalmazást kilőve nyit azonos ablakba. 
A JS hívás meg szépen megnyitja új ablakban, de a WASM SPA nem reagál többet. 
A weblap megmarad, még mozoghatok is rajta a kurzorral, de semmi nem kattintható.

Valakinek van ötlete, mit csináljak?
Mutasd a teljes hozzászólást!

  • Tapasztalod a jelenséget úgy is, hogy nem debug módban indítod el a szervert?

    Bár nem írtad, hogy milyen .NET verziót targetelsz, de ha tudod, frissítsd a Microsoft.AspNetCore.Components.WebAssembly NuGet package-eket a target framework által támogatott legújabb kiadásra.
    Mutasd a teljes hozzászólást!
  • await jsRuntime.InvokeAsync<string>
    helyett próbáld ezt:

    await jsRuntime.InvokeAsync<object>
    valószínuleg nem string-et kapsz vissza. De amúgy ilyenkor hasznos, ha megnyitod a browser console-t (általában Ctrl+Shift+I) ott szokott látszani az exception.
    Mutasd a teljes hozzászólást!
  • Jó a tipp, a doksi szerint WindowProxy objektumot ad vissza, nem sztringet:


    Return value


    WindowProxy object. The returned reference can be used to access properties and methods of the new window as long as it complies with the same-origin policy security requirements.

    Mutasd a teljes hozzászólást!
  • Igen erős kétségeim vannak afelől, hogy a generikus típusparaméter értéke okozza itt a problémát. Ha eljutna odáig a végrehajtás, hogy deszerializálni kell az interop JS hívás által visszaadott JSON-stringet C# objektummá, akkor System.Text.Json.JsonException-t kapna a Blazor WASM kódban.

    Persze ettől függetlenül javítani kell ezt is. Jó észrevétel.
    Mutasd a teljes hozzászólást!
  • Megoldottam, de sajnos nem jött be egyik tanács sem. (string-object, debug nélkül, 6.0.8 verzióról 6.0.9-re frissítés, stb)
    De köszönöm a segítséget :)

    Tapasztalataim (majd később, új verzió után újratesztelem, vagy ha valaki megteszi és más eredményre jut, kérem jelezze)

    navManager.NavigateTo(url);     // aktív lapon indít                  
    await jsRuntime.InvokeAsync<object>("open", url, "_blank");       // új lapon megnyitja az external linket, de lemered a WASM!

    A megoldás, létrehoztam egy blazor segédoldalt: @page "/ShowExternalPage/{extUrl?}"

    ennek hívása:

    await jsRuntime.InvokeAsync<object>("open", $"/ShowExternalPage/{url}", "_blank");                    // nem oldja fel a route a paramétert és érvénytelen url-re fut

    És amivel tudom hívni:
    url = HttpUtility.UrlEncode(url);
    await jsRuntime.InvokeAsync<object>("open", $"/ShowExternalPage/?targetUrl={url}", "_blank");

    A ShowExternalPage-n pedig már jól működik a:

    var thisPageUri = navManager.ToAbsoluteUri(navManager.Uri);
     QueryHelpers.ParseQuery(thisPageUri.Query).TryGetValue("targetUrl", out targetUrl);   
    navManager.NavigateTo(url, true);

    Kicsit bonyolultabb lett, de jól működik és általános megoldás a problémára.
    Mutasd a teljes hozzászólást!
abcd