В моем веб-приложении мои параметры могут содержать всевозможные сумасшедшие символы (русские символы, косые черты, пробелы и т. д.) И поэтому не всегда могут быть представлены в URL как есть. Отправка их в путь сработает примерно в 50% случаев. Некоторые вещи, такие как пробелы, уже где-то закодированы (я предполагаю, что это делает Html.BuildUrlFromExpression). Однако другие вещи (например, «/» и «*») - нет.
Теперь я не знаю, что делать, потому что, если я сам их закодирую, моя кодировка снова будет частично закодирована и в конечном итоге окажется неверной. Если я их не закодирую, некоторые символы не пройдут.
Я сделал вручную .replace () символы, с которыми у меня были проблемы. Конечно, это плохая идея.
Идеи?
--Редактировать--
Я знаю, что в моем распоряжении множество библиотек кодирования / декодирования.
Похоже, что фреймворк mvc уже пытается сделать это за меня, но не полностью.
<a href = "<%=Html.BuildUrlFromExpression<SearchController>(c=>c.Search("", 1, "a \v/&irdStr*ng"))%>" title = "my hat's awesome!">
окажет мне
<a href = "/Search.mvc/en/Search/1/a%20%5Cv/&irdStr*ng" title = "my hat's awesome!">
Обратите внимание, что косая черта, звездочка и амперсанд не экранируются. Почему одни сбежали, а другие нет? Как мне теперь правильно избежать этого?
Я что-то не так делаю или это фреймворк?





Вы пробовали использовать метод Server.UrlEncode() для кодирования и метод Server.UrlDecode() для декодирования?
У меня не было проблем с его использованием для передачи предметов.
Server.URLEncode или HttpServerUtility.UrlEncode
Я понимаю, о чем вы сейчас говорите - я не понимал, что вопрос был конкретно для MVC. Похоже на ограничение этой части платформы MVC - в частности, BuildUrlFromExpression выполняет некоторую кодировку URL-адресов, но знает, что также требует некоторых из этих знаков препинания как части URL-адресов платформы.
И, к сожалению, URLEncoding не создает инвариант, т.е.
URLEncode(x) != URLEncode(URLEncode(x))
Было бы неплохо. Тогда вы можете предварительно закодировать свои переменные, и они не будут дважды закодированы.
Вероятно, для этого есть лучшая практика платформы ASP.NET MVC. Я думаю, вы могли бы еще кое-что сделать, это закодировать в base64 или что-то, что инвариантно для URLEncode.
Как ни странно, UrlEncode не использует этот w3schools.com/TAGS/ref_urlencode.asp. Например, пробел кодируется как% 25.
На самом деле это моя проблема. Спасибо, что снова прошли мимо.
Параметры должны быть экранированы с помощью Uri.EscapeDataString:
string url = string.Format("http://www.foo.bar/page?name = {0}&address = {1}",
Uri.EscapeDataString("adlknad /?? lkm#"),
Uri.EscapeDataString(" qeio103 8182"));
Console.WriteLine(url);
Uri uri = new Uri(url);
string[] options = uri.Query.Split('?','&');
foreach (string option in options)
{
string[] parts = option.Split('=');
if (parts.Length == 2)
{
Console.WriteLine("{0} = {1}",parts[0],
Uri.UnescapeDataString(parts[1]));
}
}
Спасибо за отзыв, но обратите внимание на тег asp.net-mvc. Я отредактировал свой вопрос, чтобы прояснить ситуацию.
Попробуйте использовать Библиотека скриптов Microsoft Anti-Cross Site Scripting. Он содержит несколько методов Encode, которые кодируют все символы (включая # и символы других языков). Что касается декодирования, браузер должен нормально обрабатывать закодированный URL-адрес, однако, если вам нужно вручную декодировать URL-адрес, используйте Uri.UnescapeDataString
Надеюсь, это поможет.
Это полезная ссылка, но я не думаю, что она решит мою проблему. Я попытался сделать мою проблему более ясной в своем редактировании. Пожалуйста, посмотрите.
Экранирование косой черты и точек в части пути URL запрещено по соображениям безопасности (хотя это работает в моно).
это почему? что с параметрами, которые требуют этих вещей ... Я знаю, что мне не следует их иметь, но это внешний источник данных. Люди используют его для поиска вещей. Я не могу изменить данные ...
Html.BuildUrlFromExpression должен быть исправлен, тогда он отправит этот восходящий поток в проект MVC ... в качестве альтернативы выполните кодирование строки перед передачей в BuildUrlFromExpression и декодируйте ее, когда она вернется на другую сторону.
Это может быть нелегко исправить, поскольку IIS может заранее обрабатывать декодирование строки URL-адреса ... может потребоваться более продвинутое кодирование / декодирование для символов альтернативного пути в служебных методах и декодирование от вашего имени.
Как уже упоминали другие, если вы сначала закодируете свою строку, вы столкнетесь с проблемой.
MVC Framework кодирует символы, которые, как ей известно, необходимо кодировать, но оставляет те, которые являются допустимыми символами URL (например, &%? * /). Это связано с тем, что это допустимые символы URL-адреса, хотя они являются специальными символами в URL-адресе, которые могут не привести к желаемому результату.
Разве символы с системными символами не станут еще большим поводом для их кодирования? Я не вижу причин, по которым я должен передавать параметр, который уже выполняет (частично) работу, которую должен выполнять фактический метод.
Это не потому, что они используются системой, а потому, что они не являются допустимыми символами в соответствии со спецификацией URL, в которой они закодированы. Однако другие символы, которые определяют значение в URL-адресе, не кодируются, потому что они совершенно допустимы.
Я видел похожие посты по этому поводу. Тоже мне кажется, что это недостаток в MVC. Этой функции было бы более уместно называть "BuildUrlFromEncodedExpression". Что еще хуже, вызываемой функции необходимо декодировать свои входные параметры. Юк.
Если есть какое-либо перекрытие между символами, закодированными BuildUrlFromExpression (), и символами, закодированными вызывающим (который, я думаю, может справедливо кодировать любые не буквенно-цифровые символы для простоты), тогда у вас есть потенциал для неприятных ошибок.
Спасибо за ваш отзыв. Пожалуйста, посмотрите мой исходный пост, чтобы увидеть внесенные мной изменения. Думаю, мой вопрос был недостаточно ясным.