Question

J'essaie de créer un site simple. En gros, il possède un contrôleur Home.

Ce contrôleur a une action Index qui prend un string en tant qu'argument (qui est un répertoire) et utilise ce "répertoire" pour effectuer son travail.

Je ne vois pas comment créer une route générique «attraper tout» qui enverra chaque URL à cette action.

Toute combinaison d'URL peut exister et tout élément situé au-delà du nom de domaine doit être la chaîne.

http://<domain>/2008
http://<domain>/2008/09
http://<domain>/2008/09/Fred

Quelqu'un sait-il comment faire cela? Cela irait aussi si toutes les valeurs étaient passées sous forme de liste.

Y a-t-il une meilleure façon de faire cela?

Était-ce utile?

La solution

Essayez ceci:

routes.MapRoute(
        "Default", "{*path}",
        new { controller = "Home", action = "Index" } 
    );

Et le contrôleur:

public class HomeController : Controller {
    public ActionResult Index(string path) {
        return View();
    }
}

Autres conseils

Ma première pensée est que c'est une "mauvaise idée". Si vous pouvez prendre n'importe quoi , ils peuvent vous lancer une URL, vous devrez disposer d'une sacrée liste noire (ou liste blanche). Il y a tellement d'ouvertures. Un meilleur moyen serait d’énoncer explicitement ces itinéraires et la manière dont vous autorisez les paramètres, puis d’avoir des actions qui traitent de ces itinéraires acceptés. Vous obtiendrez alors une route générique contenant tous les éléments qui redirigerait vers une page d'erreur.

On dirait que vous essayez de mélanger des pommes et des oranges. ASP.NET MVC supprime délibérément l'idée de "page". Il n’ya vraiment aucune raison d’avoir des répertoires pour différents utilisateurs à moins que vous ne fassiez une sorte d’E / S sur fichier. Si tel est le cas, il peut être résumé plus facilement que vous ne le pensez dans le paradigme ASP.NET MVC.

Dans ASP.NET MVC, si vous souhaitez modifier les informations que vous recherchez en fonction de la chaîne transmise (à l'instar de la chaîne que vous avez transmise), voici une méthode "sans danger":

Méthode n ° 1: trois itinéraires, trois actions et différents noms

routes.MapRoute(
  "YearOnly",
  "{year}",
  new { controller = "Index", action = "ShowByYear" },
  new { year = @"\d{4}" }
);

routes.MapRoute(
  "YearAndMonth",
  "{year}/{month}",
  new { controller = "Index", action = "ShowByYearAndMonth" },
  new { year = @"\d{4}", month = @"\d{2}" }
);

routes.MapRoute(
  "YearMonthAndName",
  "{year}/{month}/{name}",
  new { controller = "Index", action = "ShowByYearMonthAndName" },
  new { year = @"\d{4}", month = @"\d{2}" }
);

Ensuite, vous utiliseriez les valeurs de route transmises dans vos actions de contrôleur pour déterminer comment elles voient les données:

ShowByYear(string year)
{
    //Return appropriate View here
}

ShowByYearAndMonth(string year, string month)
{ 
    //Return appropriate View here
}

ShowByYearMonthAndName(string year, string month, string name)
{ 
    //Return appropriate View here
}

Méthode n ° 2 - Méthode suggérée

routes.MapRoute(
  "YearOnly",
  "{year}",
  new { controller = "Index", action = "Show" },
  new { year = @"\d{4}" }
);

routes.MapRoute(
  "YearAndMonth",
  "{year}/{month}",
  new { controller = "Index", action = "Show" },
  new { year = @"\d{4}", month = @"\d{2}" }
);

routes.MapRoute(
  "YearMonthAndName",
  "{year}/{month}/{name}",
  new { controller = "Index", action = "Show" },
  new { year = @"\d{4}", month = @"\d{2}", name = "" }
);

Show(string year)
{
    //
}

Show(string year, string month)
{
    //Return appropriate View here
}

Show(string year, string month, string name)
{
    //Return appropriate View here
}

La beauté de cette approche réside dans le fait que MapRoute gère le traitement des URL; et garde le riff-raff sur. Vous pouvez ensuite configurer un itinéraire fourre-tout qui génère simplement une erreur. Vous préférez effectuer certaines analyses du côté de la route avec regex plutôt que dans votre contrôleur (à mon avis).

Cela permet de garder trois actions surchargées et d'obtenir un code plus propre et plus "MVC".

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