Мои карты является:URL-закодирован слэш в URL
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with params
new { controller = "Home", action = "Index", id = "" } // Param defaults
);
Если я использую URL http://localhost:5000/Home/About/100%2f200
нет согласования маршрута. Я меняю URL-адрес на http://localhost:5000/Home/About/100
, затем маршрут снова сопоставляется.
Есть ли простой способ работы с параметрами, содержащими косые черты? Другие сбежавшие значения (пробел %20
), похоже, работают.
EDIT:
Для кодирования Base64 работает для меня. Это делает URL уродливым, но сейчас все в порядке.
public class UrlEncoder
{
public string URLDecode(string decode)
{
if (decode == null) return null;
if (decode.StartsWith("="))
{
return FromBase64(decode.TrimStart('='));
}
else
{
return HttpUtility.UrlDecode(decode) ;
}
}
public string UrlEncode(string encode)
{
if (encode == null) return null;
string encoded = HttpUtility.PathEncode(encode);
if (encoded.Replace("%20", "") == encode.Replace(" ", ""))
{
return encoded;
}
else
{
return "=" + ToBase64(encode);
}
}
public string ToBase64(string encode)
{
Byte[] btByteArray = null;
UTF8Encoding encoding = new UTF8Encoding();
btByteArray = encoding.GetBytes(encode);
string sResult = System.Convert.ToBase64String(btByteArray, 0, btByteArray.Length);
sResult = sResult.Replace("+", "-").Replace("/", "_");
return sResult;
}
public string FromBase64(string decode)
{
decode = decode.Replace("-", "+").Replace("_", "/");
UTF8Encoding encoding = new UTF8Encoding();
return encoding.GetString(Convert.FromBase64String(decode));
}
}
EDIT1:
В итоге оказалось, что лучше всего было сохранить красиво отформатированный строку для каждого элемента нужно выбрать. Это намного лучше, потому что теперь я только кодирую значения и никогда их не расшифровываю. Все специальные символы становятся «-». У многих моих db-таблиц теперь есть дополнительный столбец «URL». Данные довольно стабильны, вот почему я могу идти этим путем. Я даже могу проверить, уникальны ли данные в «URL».
EDIT2:
Также следите за символ пробела. Это выглядит хорошо на VS интегрированный веб-сервер, но отличается от iis7 Properly url encode space character
Вы также можете придумать другой способ замаскировать косую черту, скажем, заменить ее чем-то другим по соглашению. Я знаю. Это тоже уродливо, но по крайней мере URL-адрес остается читаемым. – Tomalak
Я заметил, что косые черты и точки дают мне ошибки.Я сделал быстрый помощник, который заменяет их «-slash-» и «-dot-». Подумайте, почему обычный Url.Encode/Decode не работает. Кроме того, почему беглый персонаж должен давать какие-либо ошибки? –
Это не проблема кодирования с маршрутизацией; это, по-видимому, ошибка в классе .NET Uri. Согласно [моему чтению] URI RFC, кодированные косые черты в пути не должны рассматриваться как разделители сегментов. MVC Routing не имеет шансов получить это право, потому что класс Uri (неправильно) декодирует косые черты, прежде чем маршрутизация даже увидит его. См. Разделы 2.2 и 2.4 RFC. http://labs.apache.org/webarch/uri/rfc/rfc3986.html#reserved –