tag route page net for data asp all asp.net-mvc asp.net-mvc-routing

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.

Ver: método Controller.RedirectToAction

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):

# < > [ ] | { }

http://en.wikipedia.org/wiki/Wikipedia:Naming_conventions_(technical_restrictions)#Forbidden_characters

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("//"); }

Ver: https://pro-papers.com/


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