2008-10-20 11 views
8

Tengo un sitio de noticias con artículos etiquetados en categorías.¿Cómo puedo definir una ruta general para un sitio ASP.NET MVC?

Mi controlador se llama "categoría" y esta URL:

http://mysite.com/Category/Sport

pasa a la acción SportIndex en el controlador Category.

Quiero permitir las siguientes URL:

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

Qué pasa toda la información de la categoría a la acción en el controlador IndexCategory.

¿Cómo creo una ruta catch-all que maneje todo esto y los envíe a la categoría?

Respuesta

2

Hay una muy buena respuesta a mi pregunta en este sentido here.

+0

made jmcd ... eso me puso en el camino correcto y me di cuenta del resto. (stackoverflow es genial) – WayneDV

+2

Las respuestas de enlace único se desaconsejan en SO. – spender

0

Puede hacerlo de esta manera:

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

y luego en su controlador:

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

No que cualquier la ruta anterior se utilizará para todas las rutas (no se puede tener una página Acerca de, etc. a menos que especifique rutas explícitas antes que la anterior).

Sin embargo, podría incluir una restricción personalizada para limitar la ruta a solo las categorías existentes. Algo así como:

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; 
    } 
} 

¿Qué se utiliza en su ruta como esta:

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

De esa manera que no interfiera con sus otras rutas definidas.

Cuestiones relacionadas