ASP.NET MVC - mapeamento parâmetro de seqüência de mais de uma consulta a um url bonita

StackOverflow https://stackoverflow.com/questions/417000

  •  03-07-2019
  •  | 
  •  

Pergunta

Estou um pouco preso no design dos meus SEO URLs amigáveis ??para mvc .... Tomemos por exemplo o seguinte URL: http:? //myapp/venues/resturants.aspx location = Central & orderBy = top- avaliado

Com meu aplicativo mvc i mapearam-lo da seguinte forma: http: // myapp / locais / list / restaurantes / centro / top-rated
{Controlador} / {ação} / {categoria} / {location} / {fim}

Agora, o único problema é que localização e fim são opcionais ... por isso deve ser possível apresentar um pedido como: http: // myapp / locais / list / restaurantes / votadas . Isso prova a ser um problema quando o pedido atinge a ação do controlador, o parâmetro local pegou "top-classificado", naturalmente.

Todas as sugestões? I' estou pensando em usar querystrings explícitas para lidar com mais de um parâmetro, mas esta é realmente a minha última opção como eu não quer sacrificar SEO muito.

Alguém ELES correr em tais dilemas? E como você lidou com isso?

Agradecemos antecipadamente!

Foi útil?

Solução

Assumindo que os valores permitidos para localização e ordem são únicos (ou seja, quando eles vêm, você pode distingui-los, ou então, se eles só fornecer um, como você vai saber se é um local ou uma ordem?) , então você pode apenas tomar dois parâmetros e descobrir o que eles estão no comando.

Route: {controller}/{action}/{param1}/{param2}

ação Controlador:

public ActionResult MyAction(string param1, string param2)
{
    string location;
    string order;
    if (!ParseLocation(param1, out location))
    { ParseLocation(param2, out location); }
    // ...
}

Não é particularmente elegante, mas não deixá-lo ter as URLs que você deseja.

Outras dicas

Clique no seu perfil ligação e olhar para as URLs para Estatísticas, recentes, Response, etc.

Exemplos:

sem classificá-lo como padrão estatísticas

paramters opcionais deve ser consulta parâmetros

Você sempre terá esse problema se você tiver vários parâmetros opcionais. Quer fazer um ou ambos não opcional (e posicionado no início da string de consulta que o opcional) ou usar a notação parâmetro querystring.

ok caras apenas postar uma solução Eu tenho jogado com até agora.

Eu configurei meus rotas usando restrições da seguinte forma:

        routes.MapRoute(
            "VenuesList",                                              
            "venues/list/{category}/{location}/{orderBy}",             
            new { controller = "venues", action = "list", category = "", location = "", orderBy = "" },
            new { location = "central|east|west|south", orderBy = "top-rated|price" }
        );

    routes.MapRoute(
            "VenuesListByLocation",                                              
            "venues/list/{category}/{location}",                           
            new { controller = "venues", action = "list", category = "", location = "" },
            new { location = "central|east|west|south" }
        );

        routes.MapRoute(
            "VenuesListByOrder",                                              
            "venues/list/{category}/{orderBy}",                           
            new { controller = "venues", action = "list", category = "", orderBy = "" },
            new { orderBy = "top-rated|price" }
        );

        routes.MapRoute(
            "VenuesListDefault",                                              
            "venues/list/{category}",                           
            new { controller = "venues", action = "list", category = "" }

        );

        routes.MapRoute(
            "Default",                                              
            "{controller}/{action}/{id}",                           
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        ); 

A idéia é que, se a validação falhar, ele irá para a próxima rota na lista ... eventualmente bater o padrão.

Precisa de mais alguns testes, mas tem funcionado bem até agora ...

Por que você não criar uma propriedade na página para cada parâmetro querystring possível?

Desta forma, você pode lidar com isso da maneira que quiser com apenas algumas linhas de código ...

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