Pergunta

Eu tenho um site de notícias com artigos marcado em categorias.

O meu controlador é chamado de "Categoria" e este URL:

http://mysite.com/Category/Sport

passa Sport à ação Index em Category controlador.

eu quero permitir que os seguintes URLs:

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

que passa todas as informações da categoria para a ação Index em Category controlador.

Como faço para criar um catch-all rota que lida com todas estas e ônibus-los para categoria?

Foi útil?

Solução

Há uma boa resposta muito à minha pergunta ao longo destas linhas aqui .

Outras dicas

Você pode fazê-lo como este:

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

e, em seguida, em seu controlador:

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

Do not que qualquer rota acima será usado para rotas TODAS (você pode não ter uma página Sobre etc menos que você especifique rotas explícitas antes de a citada acima).

Você pode, porém, incluir uma restrição personalizada para limitar a rota para categorias só existentes. Algo 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;
    }
}

O que você usa em sua rota como esta:

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

Em dessa forma ele não irá interferir com suas outras rotas definidas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top