2011-10-24 24 views
6

tengo URLs como:cómo manejar esta ruta?

  • /es/blog (muestra vista o un blog entradas)
  • en el blog Pays-gran-cocinar-y-ser-justo recompensado (muestra artículo///blog con urltitle)
  • /es/blog/por qué, en lugar de lo dietista-cocinero (espectáculos elemento blog con urltitle)

de rutas ¿Cuántos seguidores he definido

  • A: ruta "es/blog/{página del artículo}" con página del artículo limitación = @ "\ d"
  • B: ruta "es/blog"
  • C: Ruta "es/blog/{urltitle} {página/comentario } "con la página restricción comentario = @" \ d "
  • d: ruta" es/blog/{urltitle} "

pregunta 1: esto funciona bien, pero tal vez hay una solución mejor con menos pistas?

Pregunta 2: añadir un nuevo artículo, tengo una AddArticle método de acción en Blog controlador. Por supuesto, con las rutas definidas anteriormente, la URL "/ es/blog/addarticle" sería asignar a la ruta D, donde addarticle sería el urltitle -que no es correcta, por supuesto. Por lo tanto, he añadido la siguiente ruta:

  • E: ruta "com/blog/_ {acción}"

y por eso ahora carpeta de la URL "/ es/blog/_addarticle" a esta ruta, y ejecuta el método de acción correcto. Pero me preguntaba si hay una mejor manera de manejar esto.

Gracias por el consejo.

+1

Buena pregunta. Estoy realmente interesado en cualquier respuesta. – Phil

+0

¿Tal vez la restricción de ruta personalizada podría ser la solución más elegante? –

+0

bien, para la pregunta 2 Encontré la respuesta yo mismo. Creé una restricción personalizada llamada ExcludeConstraint y cambié la ruta D como: ruta "nl/blog/{urltitle}" con la restricción "new {urltitle = new ExcludeConstraint (new List () {" addarticle "," addcomment "," gettags " "})}));". Ahora, mi URL se mantiene limpia, como/nl/blog/addcomment –

Respuesta

4

Las respuestas a mis preguntas:

Para la pregunta uno, crean una restricción personalizada IsOptionalOrMatchesRegEx:

public class IsOptionalOrMatchesRegEx : IRouteConstraint 
{ 
    private readonly string _regEx; 

    public IsOptionalOrMatchesRegEx(string regEx) 
    { 
     _regEx = regEx; 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     var valueToCompare = values[parameterName].ToString(); 
     if (string.IsNullOrEmpty(valueToCompare)) return true; 
     return Regex.IsMatch(valueToCompare, _regEx); 
    } 
} 

A continuación, los puntos A y B se pueden sobreexpresa en una ruta:

  • url: "com/blog/artículo {página}"
  • valores por defecto: nuevo artículo de la página = {UrlParameter.Opcional}
  • limitaciones: nueva {articlepage = new IsOptionalOrMatchesRegEx (@ "\ d")

Para la pregunta 2, que crearon una ExcludeConstraint:

public class ExcludeConstraint : IRouteConstraint 
{ 
    private readonly List<string> _excludedList; 

    public ExcludeConstraint(List<string> excludedList) 
    { 
     _excludedList = excludedList; 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     var valueToCompare = (string)values[parameterName]; 
     return !_excludedList.Contains(valueToCompare);    
    } 
} 

Ruta D podría entonces ser cambiado como:

  • url: "nl/blog/{} urltitle"
  • limitaciones: {nueva urltitle = new ExcludeConstraint (nueva lista() { "una ddarticle "," addcomment "," gettags "})}));
Cuestiones relacionadas