Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Vakos
Tvůrce
Avatar
Vakos:20.11.2018 22:33

Ahoj,

dělám jeden projekt v ASP NET Core, který běží na linuxu na apache. Mám tam ale problém s url a to přesně s %2F, což je lomítko. Linux to ale nějak neví a tak nic nezobrazí.

Neděje se to však vždy. V routes mám různá pravidla že když za doménou něco bude, tak se to zpracuje tak a tak a to funguje jak má. Problém je ale u tohoto:

routes.MapRoute(
        name: "gallery",
        template: "gallery/{*url}",
        defaults: new { controller = "Gallery", action = "Details" });

Mělo by to fungovat tak, že když za doménou bude napsané gallery, tak vše za lomítkem vezme jako parametr se kterým dále pracuje. Zde nastává ten problém, že v parametru je lomítko a místo lomítka to tam vkládá %2F.

Zkusil jsem: Zkoušel jsem různé úpravy a také googlit, ale zatím jsem nedošel k výsledku, který bych potřeboval.

Chci docílit: Nevíte jak toto vyřešit, aby se mi místo %2F zobrazovalo lomítko a vše se načetlo správně?

Odpovědět
20.11.2018 22:33
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Avatar
Vakos
Tvůrce
Avatar
Vakos:20.11.2018 23:22

Zjistil jsem novou skutečnost. Problém nastává, když url skládám ve view. Alternativa je to celé překopat, ale měl bych tam téměř duplicitní věci, což je škoda.
Pro úplnost problém nastává zde

asp-route-id="@ViewBag.ParentURL/@item.URL"

Lomítko se přeloží na %2F. Zkoušel jsem to i přes pomocnou proměnnou vytvořenou ve view, ale problém stále přetrvává.

Nahoru Odpovědět
20.11.2018 23:22
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Avatar
Vakos
Tvůrce
Avatar
Vakos:21.11.2018 9:34

Další poznatek. Pokud si url vytvořím do pomocné proměnné

string link = @ViewBag.ParentURL + @Html.Raw("/") + @item.URL;

Po výpis někde na stránku se vše zobrazí jak má. Bohužel při předávání asp-route-url="@link" to nepředá lomítko, ale %2F.

Nahoru Odpovědět
21.11.2018 9:34
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:21.11.2018 14:36

:)
Ten preklad je samozrejme spravny.

Konvertovani do toho tvaru vypada nejak takto:

// js
function escapeUrl(str)
{
var func;
func = encodeURIComponent || encodeURI || escape;
return func(str);
//encodeURIComponent(value).replace(/!/g,'%21').replace(/'/g,'%27').replace(/\(/g,'%28').replace(/\)/g,'%29').replace(/\*/g,'%2A').replace(/%20/g,'+');
}

// php
function escapeUrl($str) {return urlencode($str);}
function unescapeUrl($str) {return urldecode($str);}
<script>
a = '@ViewBag.ParentURL/@item.URL';
b = '@ViewBag.ParentURL/@item.URL';
url = 'xxx?a=' + escapeUrl(a) + '&b=' + escapeUrl(a);
link = '<a href="'+escapeHTML(url)+'">'
</script>

Tvuj php/asp script by to mel umet dekodovat automaticky. Pokud ne, je ta volba vypnuta nekde v nastaveni asp a musis to dekodovat funkci, viz moje unescapeUrl.
Nebo, jakym zpusobem, kde se to pokousis dekodovat?

 
Nahoru Odpovědět
21.11.2018 14:36
Avatar
Vakos
Tvůrce
Avatar
Odpovídá na Peter Mlich
Vakos:21.11.2018 17:40

Moc tě nechápu. Dle toho co píšeš, tak je správně, že / se hodí na %2F. Dle mého zjištění, co jsem psal, tak stane se to pouze když se to předává jako parametr, když si proměnnou v šabloně vypíšu, tak se zobrazí vše jak má.

Dále je pak divné, že když jsem si ve funkci, která přebírala parametr zkoušel detekovat zda je tam %2F, tak mi to nikdy nenašlo, protože už tam nebylo %2F, ale /. Na windows se vše načetlo jak má (v url bylo %2F), ale na linuxu nic. Hodilo to ale chybu, že to nenašlo stránku pod url tou a tou a zase zde bylo %2F, ale /.

To co se děje na windows, že je v url %2F a načte se mi nevyhovuje, protože prostě pro uživatele to vypadá blbě, ale aspoň to jede.

Nahoru Odpovědět
21.11.2018 17:40
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Avatar
don.jarducius:21.11.2018 19:13

Ahoj,
při zpracování View ti MVC v atributech automaticky escapuje zapisované údaje. Proto ti přeloží / na %2F, můžeš použít Html.Raw pro zápis ve View, nebo HttpUtility.Ur­lDecode pro dekódování před zpracováním při obsluze.
takže by zápis byl asp-route-id="@Html.Raw(Vi­ewBag.ParentUR­L+"/"+item.UR­L)"

Nahoru Odpovědět
21.11.2018 19:13
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
Vakos
Tvůrce
Avatar
Odpovídá na don.jarducius
Vakos:21.11.2018 19:37

Bohužel to tady pracuje ještě nějak jinak. Kdyby to tak fungovalo, tak jak píšeš, tak už bych to to dávno měl.

Raději jsem ale vše zkoušel znovu a to jak Html.Raw, tak HttpUtility.Ur­lDecode. Vše mělo stejný výsledek, tedy %2F.

Nahoru Odpovědět
21.11.2018 19:37
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Avatar
don.jarducius:21.11.2018 20:00

I zpracování v controlleru proměnné url pomocí HttpUtility.Ur­lDecode? Může to totiž dělat i to zpracování zbytku url do proměnné...

Nahoru Odpovědět
21.11.2018 20:00
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
don.jarducius:21.11.2018 20:04

Když jsem dělal něco podobného používal jsem na to vlastní "router", něco jako toto kde jsem si rovnou překládal a routoval na controllery

Nahoru Odpovědět
21.11.2018 20:04
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
Vakos
Tvůrce
Avatar
Odpovídá na don.jarducius
Vakos:21.11.2018 20:14

Je to chyba routeru? Když je to zadané správně, tak i na linuxu to funguje jak má. Problém vidím v předávání těch parametrů.
I v controlleru jsem to dělal a nic. Když bych to ale upravoval v conrolleru, tak se mi nezmění tvar url, který potřebuji ne?

Nahoru Odpovědět
21.11.2018 20:14
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Avatar
don.jarducius:23.11.2018 19:48

Je to problém renderování. Z attributu asp-route-id to escapuje, kdežto když to vložíš do href, tak to nechá pa pokoji.

Nahoru Odpovědět
23.11.2018 19:48
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
Vakos
Tvůrce
Avatar
Odpovídá na don.jarducius
Vakos:23.11.2018 22:16

ok, takže je třeba vytvořit vlastní router? Máš s tím nějak víc zkušeností, zda vše musí být zahrnuto ve vytvořeném, nebo to jde i nakombinovat se stávajícím? Současné řešení dělá vše co chci, jen blbne to escapovaní.

Nahoru Odpovědět
23.11.2018 22:16
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Avatar
Vakos
Tvůrce
Avatar
Vakos:8.12.2018 10:10

Problém vyřešen novou verzí ASP NET Core 2.2.
V dřívějších verzích byla pouze verze, která encoduje lomítka

[Route("{*url}")]

Nyní je tam už je i verze, která to nedělá. Liší se to v hvězdičkách

[Route("{**url}")]
Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět
8.12.2018 10:10
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.