2011-10-24 10 views
6

Ho URL del tipo:Come gestire questo percorso?

  • /it/blog (spettacoli panoramica o blog voci)
  • /it/blog/pays-grande-cuocere-e-è-fiera-premiato (mostra voce blog con urltitle)
  • /it/blog/why-piuttosto-che-dietista-Cook (Shows blog con urltitle)

per le rotte quanti seguaci ho definito

  • A: percorso "en/blog/{pagina dell'articolo}" con la pagina articolo vincolo = @ "\ d"
  • B: percorso "en/blog"
  • C: Route "it/blog/{urltitle}/{commento pagina } "con il commento vincolo = @" \ d "
  • d: percorso" en/blog/{urltitle} "

domanda 1: questo funziona bene, ma forse c'è una soluzione migliore con meno tracce?

Domanda 2: per aggiungere un nuovo articolo, ho un metodo di azione AddArticle in Blog Controller. Naturalmente, con i percorsi definiti sopra, l'URL "/ it/blog/addarticle" sarebbe mappa per instradare D, dove addarticle sarebbe l'urltitle-che non è corretto, naturalmente. Quindi ho aggiunto il seguente percorso:

  • E: itinerario "com/blog/_ {azione}"

e così ora l'URL cartella "/ it/blog/_addarticle" a questo percorso, ed eseguire il metodo azione corretta. Ma mi chiedevo se c'è un modo migliore per gestire questa situazione?

Grazie per il consiglio.

+1

Bella domanda. Sono davvero interessato a qualsiasi risposta. – Phil

+0

Forse il vincolo del percorso personalizzato potrebbe essere la soluzione più elegante? –

+0

ok, per la domanda 2 ho trovato la risposta da solo. Ho creato un vincolo personalizzato chiamato ExcludeConstraint e ho modificato la rotta D come: route "nl/blog/{urltitle}" con il vincolo "new {urltitle = new ExcludeConstraint (new List () {" addarticle "," addcomment "," gettags "})}));". Ora, il mio URL rimane pulito, come/nl/blog/addcomment –

risposta

4

risposte alle mie domande:

Per la domanda uno, ho creato un vincolo personalizzato 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); 
    } 
} 

Poi, i punti A e B possono essere overexpressed in un unico percorso:

  • url: "com/blog/articolo {page}"
  • valori di default: nuova pagina dell'articolo = {UrlParameter.Opzionali}
  • vincoli: new {articlepage = new IsOptionalOrMatchesRegEx (@ "\ d")

per la domanda 2, ho creato un 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);    
    } 
} 

Route D potrebbe quindi essere cambiato come:

  • url: "nl/blog/{} urltitle"
  • vincoli: new {urltitle = new ExcludeConstraint (nuova Lista() { "un ddarticle "," addcomment "," gettags "})}));
Problemi correlati