Domanda

Ho un sito di notizie con articoli taggati in categorie.

Il mio controller si chiama " Categoria " e questo URL:

  

http://mysite.com/Category/Sport

passa Sport all'azione Index nel controller Categoria .

Voglio consentire i seguenti URL:

  

http://mysite.com/Sport/Hockey
   http://mysite.com/Sport/Football
   http://mysite.com/Science/Evolution

Che passa tutte le informazioni sulla categoria all'azione Index nel controller Categoria .

Come posso creare un percorso catch-all che gestisca tutti questi e li sposti in categoria?

È stato utile?

Soluzione

C'è una risposta abbastanza buona alla mia domanda in questo senso qui .

Altri suggerimenti

Puoi farlo in questo modo:

routes.MapRoute("Default", "{category}/{subcategory}",
    new { controller = "CategoryController", action = "Display", id = "" }
);

e quindi nel tuo controller:

public class CategoryController : Controller
{
    public ActionResult Display(string category, string subcategory)
    {
        // do something here.
    }
}

Non utilizzare alcun percorso sopra per TUTTI i percorsi (non è possibile avere una pagina Informazioni ecc. a meno che non si specifichino percorsi espliciti prima di quello sopra).

Puoi tuttavia includere un vincolo personalizzato per limitare il percorso solo alle categorie esistenti. Qualcosa del tipo:

public class OnlyExistingCategoriesConstraint : IRouteConstraint
{
    public bool Match
        (
            HttpContextBase httpContext,
            Route route,
            string parameterName,
            RouteValueDictionary values,
            RouteDirection routeDirection
        )
    {
        var category = route.DataTokens["category"];
        //TODO: Look it up in your database etc


        // fake that the category exists
        return true;
    }
}

Che usi nel tuo percorso in questo modo:

routes.MapRoute("Default", 
    "{category}/{subcategory}",
    new { controller = "CategoryController", action = "Display", id = "" },
    new { categoryExists = new OnlyExistingCategoriesConstraint() }
);

In questo modo non interferirà con le altre rotte definite.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top