ASP.NET MVC - Mappage de plusieurs paramètres de chaîne de requête sur une jolie URL

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

  •  03-07-2019
  •  | 
  •  

Question

Je suis un peu coincé sur la conception de mes urls respectueuses de la SEO pour MVC .... Prenons par exemple l'URL suivante: http: //myapp/venues/resturants.aspx? location = central & amp; orderBy = les mieux notés

Avec mon application MVC, je l’ai cartographiée comme suit: http: // myapp / sites / liste / restaurants / central / les mieux notés
{contrôleur} / {action} / {catégorie} / {emplacement} / {ordre}

Maintenant, le seul problème est que l'emplacement et l'ordre sont facultatifs ... il devrait donc être possible de soumettre une demande du type: http: // myapp / sites / list / resturants / top-rated . Cela s'avère être un problème lorsque la demande frappe l'action du contrôleur, le paramètre d'emplacement a été repris "naturellement", naturellement.

Des suggestions? J'envisage d'utiliser des chaînes de requête explicites pour gérer plusieurs paramètres, mais c'est vraiment ma dernière option car je ne veux pas trop sacrifier le référencement.

Quelqu'un at-il rencontré de tels dilemmes? Et comment l'avez-vous géré?

Merci d'avance!

Était-ce utile?

La solution

En supposant que les valeurs autorisées pour l'emplacement et l'ordre soient uniques (c'est-à-dire que, lorsqu'elles arrivent, vous pouvez les différencier, ou si elles n'en fournissent qu'un, comment allez-vous savoir s'il s'agit d'un emplacement ou d'une commande?) , vous pouvez alors prendre deux paramètres et déterminer ce qu’ils sont dans le contrôleur.

Route: {contrôleur} / {action} / {param1} / {param2}

Action du contrôleur:

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

Pas particulièrement élégant, mais vous donne les URL que vous voulez.

Autres conseils

Cliquez sur votre lien de profil et recherchez les URL correspondant à Statistiques, Récent, Réponse, etc.

.

Exemples:

sans tri, il utilise par défaut des statistiques

Les paramètres facultatifs doivent être des paramètres de requête

Vous aurez toujours ce problème si vous avez plusieurs paramètres facultatifs. Rendez l’un ou les deux non facultatifs (et positionnez-les plus tôt dans la chaîne de requête que la facultative) ou utilisez la notation du paramètre de chaîne de requête.

ok les gars viennent de poster une solution, je joue avec jusqu'à présent.

J'ai configuré mes itinéraires en utilisant les contraintes suivantes:

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

L'idée est que si la validation échoue, elle passera à la prochaine route de la liste ... en atteignant éventuellement la valeur par défaut.

A besoin de quelques tests supplémentaires mais a bien fonctionné jusqu'à présent ...

Pourquoi ne créez-vous pas une propriété dans la page pour chaque paramètre de chaîne de requête possible?

De cette façon, vous pouvez le gérer comme vous le souhaitez avec seulement quelques lignes de code ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top