Diskuze: URL - %2F
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 13 zpráv z 13.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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á.
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.
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?
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.
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.UrlDecode pro dekódování před zpracováním při
obsluze.
takže by zápis byl
asp-route-id="@Html.Raw(ViewBag.ParentURL+"/"+item.URL)"
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.UrlDecode. Vše mělo stejný výsledek, tedy %2F.
I zpracování v controlleru proměnné url pomocí HttpUtility.UrlDecode? Může to totiž dělat i to zpracování zbytku url do proměnné...
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
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?
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.
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í.
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}")]
Zobrazeno 13 zpráv z 13.