Mi mapa es:barra URL codificada en URL
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with params
new { controller = "Home", action = "Index", id = "" } // Param defaults
);
Si utilizo la URL http://localhost:5000/Home/About/100%2f200
no hay ninguna ruta coincidente. Cambio la URL a http://localhost:5000/Home/About/100
y la ruta vuelve a coincidir.
¿Hay alguna manera fácil de trabajar con parámetros que contienen barras inclinadas? Otros valores escapados (espacio %20
) parecen funcionar.
EDIT:
para codificar base 64 funciona para mí. Hace que la URL sea fea, pero está bien por ahora.
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:
Al final resultó que era la mejor manera de ahorrar una cadena muy bien formateado para cada artículo que necesito para seleccionar. Eso es mucho mejor porque ahora solo codigo valores y nunca los decodifico. Todos los caracteres especiales se convierten en "-". Muchas de mis tablas db ahora tienen esta columna adicional "URL". La información es bastante estable, por eso puedo ir por este camino. Incluso puedo verificar si los datos en "URL" son únicos.
Edit2:
También ten cuidado con carácter de espacio. Se ve bien en VS servidor web integrado, pero es diferente en iis7 Properly url encode space character
También podría encontrar alguna otra forma de enmascarar la barra, por ejemplo, reemplazarla por otra cosa por convención. Lo sé. Eso es feo también, pero al menos la URL permanece algo legible. – Tomalak
Noté que las barras diagonales y los puntos me dan errores.Hice una ayuda rápida que los reemplaza con "-slash-" y "-dot-". Me pregunto por qué el Url.Encode/Decode no funciona. Además, ¿por qué un personaje escapado estaría dando algún error? –
Esto no es un problema de codificación con el enrutamiento; aparentemente es un error en la clase .NET Uri. De acuerdo con [mi lectura de] URI RFC, las barras diagonales codificadas en la ruta no deben considerarse separadores de segmentos. El enrutamiento MVC no tiene la posibilidad de hacerlo bien porque la clase Uri (incorrectamente) decodifica las barras antes de que el enrutamiento lo vea. Ver la sección 2.2 y 2.4 del RFC. http://labs.apache.org/webarch/uri/rfc/rfc3986.html#reserved –