Frage

Ich versuche eine einfache Website zu erstellen. Grundsätzlich hat es einen Controller Home Regler.

Dieser Controller hat eine Aktion Index nimmt ein string als Argument (was ein Verzeichnis ist) und dieses "Verzeichnis" verwendet, um seine Arbeit zu erledigen.

Ich kann nicht herausfinden, wie man einen generischen Fang alle Route erstellt, die jede URL zu dieser einen Aktion sendet.

Jede URL -Kombination könnte existieren, und alles, was über den Domänennamen hinausgeht, sollte die Zeichenfolge sein.

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

Weiß jemand, wie man das macht? Es wäre auch in Ordnung, wenn alle Werte als Liste übergeben würden.

Gibt es eine bessere Möglichkeit, dies zu tun?

War es hilfreich?

Lösung

Versuche dies :

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

Und der Controller:

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

Andere Tipps

Mein erster Gedanke ist, dass das eine "schlechte Idee" ist. Wenn Sie nehmen können irgendetwas Sie können dich für eine URL anwerfen, du musst eine schwarze Liste (oder Whitelist) haben. Es gibt so viele Öffnungen. Ein besserer Weg wäre es, diese Routen explizit und wie Sie Parameter zuzulassen, und dann Aktionen zu haben, die sich mit diesen akzeptierten Routen befassen. Sie haben dann einen generischen Catch alle Route, der zu einer Fehlerseite umgeleitet wird.

Es fühlt sich an, als würden Sie versuchen, Äpfel und Orangen zu mischen. ASP.NET MVC fährt absichtlich mit der Idee "Seite" ab. Es gibt wirklich keinen Grund, Verzeichnisse für verschiedene Benutzer zu haben, es sei denn, Sie erstellen eine Art Datei -I/O.

In ASP.NET MVC, wenn Sie die Informationen, die Sie basierend auf der von Ihnen bestandenen Zeichenfolge suchen, variieren möchten (ähnlich wie die von Ihnen bestandene Zeichenfolge), ist hier eine "sichere" Art, dies zu tun:

Methode Nr. 1 - Drei Routen, drei Aktionen, verschiedene Namen

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

Und dann würden Sie die bestandenen Routenwerte in Ihren Controller -Aktionen verwenden, um festzustellen, wie sie die Daten sehen:

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
}

Methode Nr. 2 - Vorgeschlagene Methode

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
}

Das Schöne an diesem Ansatz ist, dass die MapRoute Griff URL -Parsen; und hält das Riff-Raff aus. Sie können dann einen Cape-All-Route einrichten, der nur einen Fehler macht. Sie möchten lieber das Analysen auf der Route mit der Seite machen lassen regex als in Ihrem Controller (meiner Meinung nach).

Dies hält es auf drei überlastete Aktionen und ermöglicht einen saubereren und mehr MVC'-iS-Code.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top