asp.net mvc - route - URLs con barra en el parámetro?
select asp-for asp-items (4)
@Darin: Bueno, eso es obvio, la pregunta es: ¿por qué? se dan el controlador + acción + identificación, es como si estuviese pasando todos estos al enrutamiento de nuevo ... - Quandary 13 de junio de11 a 17:38
Quandry: tal vez ya se haya dado cuenta de esto porque su pregunta tiene más de un año, pero cuando llama a RedirectToAction, en realidad está enviando una respuesta HTTP 302 al navegador, lo que hace que el navegador haga una solicitud GET a la acción especificada. Por lo tanto, el bucle infinito que está viendo.
Pregunta:
Estoy creando un software wiki, básicamente un clon de wikipedia / mediawiki, pero en ASP.NET MVC (el MVC es el punto, así que no me recomiendes ScrewTurn).
Ahora tengo una pregunta:
Uso este mapeo de ruta para enrutar una URL como:
http://en.wikipedia.org/wiki/ASP.NET
routes.MapRoute(
"Wiki", // Routenname
//"{controller}/{action}/{id}", // URL mit Parametern
"wiki/{id}", // URL mit Parametern
new { controller = "Wiki", action = "dbLookup", id = UrlParameter.Optional } // Parameterstandardwerte
);
Ahora me acaba de ocurrir que podría haber títulos como ''AS / 400'':
http://en.wikipedia.org/wiki/AS/400
Incidentalmente, también está este (título ''Slash''):
http://en.wikipedia.org/wiki//
Y éste:
http://en.wikipedia.org/wiki//dev/null
En general, Wikipedia parece tener una lista de títulos interesantes como este: http://en.wikipedia.org/wiki/Wikipedia:Articles_with_slashes_in_title
¿Cómo hago rutas como esta ruta correctamente?
Editar:
Algo como:
Si la URL comienza con / Wiki /, y si no comienza con / wiki / Edit / (pero no / Wiki / Edit), pase todo el resto de la URL como Id.
Editar:
Hmm, solo otro problema: ¿cómo puedo enrutar este:
http://en.wikipedia.org/wiki/C&A
Wikipedia puede ...
Editar:
Según wikipedia, debido a los choques con la sintaxis de wikitext, solo los siguientes caracteres nunca se pueden usar en los títulos de las páginas (ni son compatibles con DISPLAYTITLE):
# < > [ ] | { }
Editar:
Para permitir * y &, poner
<httpRuntime requestPathInvalidCharacters="" />
en la sección <system.web> en el archivo web.config
(Encontrado aquí: http://www.christophercrooker.com/use-any-characters-you-want-in-your-urls-with-aspnet-4-and-iis )
Puede usar una ruta de captura para capturar todo lo que sigue a la parte wiki
de la url en el token de identidad:
routes.MapRoute(
"Wiki",
"wiki/{*id}",
new { controller = "Wiki", action = "DbLookup", id = UrlParameter.Optional }
);
Ahora si tiene la siguiente solicitud: /wiki/AS/400
se asignará a la siguiente acción en el controlador Wiki
:
public ActionResult DbLookup(string id)
{
// id will equal AS/400 here
...
}
En lo que respecta a /wiki//
, creo que obtendrás un error de 400 solicitudes erróneas del servidor web antes de que esta solicitud llegue alguna vez a la interconexión de ASP.NET. Puede consultar la siguiente publicación de blog .
Todavía como una opción, escriba en el archivo Global.asax:
var uri = Context.Request.Url.ToString();
if (UriHasRedundantSlashes(uri))
{
var correctUri = RemoveRedundantSlashes(uri);
Response.RedirectPermanent(correctUri);
}
}
private string RemoveRedundantSlashes(string uri)
{
const string http = "http://";
const string https = "https://";
string prefix = string.Empty;
if (uri.Contains(http))
{
uri = uri.Replace(http, string.Empty);
prefix = http;
}
else if (uri.Contains(https))
{
uri = uri.Replace(https, string.Empty);
prefix = https;
}
while (uri.Contains("//"))
{
uri = uri.Replace("//", "/");
}
if (!string.IsNullOrEmpty(prefix))
{
return prefix + uri;
}
return uri;
}
private bool UriHasRedundantSlashes(string uri)
{
const string http = "http://";
const string https = "https://";
if (uri.Contains(http))
{
uri = uri.Replace(http, string.Empty);
}
else if (uri.Contains(https))
{
uri = uri.Replace(https, string.Empty);
}
return uri.Contains("//");
}
en Attribute Routing
en mvc tuve el mismo problema al tener /
in string abc/cde
en HttpGet
[Route("verifytoken/{*token}")]
[AllowAnonymous]
[HttpGet]
public ActionResult VerifyToken(string token)
{
//logic here
}
entonces debes colocar *
porque después de esto se considerará como parámetro