Моя карта:
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
), похоже, работают.
РЕДАКТИРОВАТЬ:
Для кодирования 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));
}
}
РЕДАКТИРОВАТЬ1:
В конце концов выяснилось, что лучший способ - сохранить красиво оформленную строку для каждого элемента, который мне нужно выбрать. Это намного лучше, потому что теперь я только кодирую значения и никогда не декодирую их. Все специальные символы становятся "-". Многие из моих db-таблиц теперь имеют этот дополнительный столбец «URL». Данные довольно стабильны, поэтому я могу пойти этим путем. Я даже могу проверить, уникальны ли данные в "URL".
РЕДАКТИРОВАТЬ2:
Также следите за космическим персонажем. Он выглядит нормально на интегрированном веб-сервере VS, но отличается от iis7 Правильно кодирует пробел в URL-адресе
+
и/
на-
и_
соответственно (и обратно на принимающей стороне). Это хорошо известный безопасный прием (сам алфавит Base64 не содержит-
и_
) и при этом дешевый. Это означает, что все еще можно использовать существующие библиотеки кодировщиков. - person Tomalak   schedule 25.02.2013