MVC Routing Einschränkung auf den Controller-Namen
Habe ich die Routen so eingerichtet:
context.MapRoute(
name: "Area",
url: "Area/{controller}/{action}",
defaults: new
{
controller = "Home",
action = "Dashboard"
}
);
context.MapRoute(
name: "AccountArea",
url: "Area/{accountFriendlyId}/{controller}/{action}",
defaults: new
{
controller = "Home",
action = "Dashboard",
accountFriendlyId = RouteParameter.Optional
}
);
context.MapRoute(
name: "AccountCampaignArea",
url: "Area/{accountFriendlyId}/{campaignFriendlyId}/{controller}/{action}",
defaults: new
{
controller = "Home",
action = "Dashboard",
accountFriendlyId = RouteParameter.Optional,
campaignFriendlyId = RouteParameter.Optional
}
);
Und ich habe einen brennenden Wunsch zu haben Area/friendlyAccountName/Home
nimm mich mit zu den Dashboard()
aber das funktioniert nicht (404). Ich denke der Grund dafür ist, dass wir die Suche nach einem friendlyAccountName controller.
Wohl mit dem wissen, dass, wenn ich entscheiden sollten, um den Namen des Benutzerkontos ein, nach einem meiner Controller kommt alles zusammenbrechen, gibt es eine Möglichkeit, durch zu fallen, um die nächste route bei einem string nicht zu finden, der einen entsprechenden controller? Gibt es eine Möglichkeit zur reflektion verwenden und vermeiden Sie die Aufrechterhaltung einer Einschränkung jedes mal, wenn ich ändern Sie die Liste von meinem Controller?
BEARBEITEN
Kennen Sie einen Weg, der nicht mit der Reflexion oder zumindest enthält die abgeleiteten Typ Suche zu diesem Bereich? Ich weiß nicht, wie die Idee entstehen, dass overhead zweimal ein, wenn der zweite parameter der route entspricht eine controller-Namen (pass-Einschränkung dann wieder suchen bei der Konstruktion der controller). Ich wünschte, es war ein Weg, um die Ausnahme zu fangen an der Stelle, konstruieren einen controller und dann sichern und die durch fallen, auf die nächste route.
InformationsquelleAutor nik.shornikov | 2012-05-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum müssen Sie der ersten route überhaupt? Wenn
{accountFriendlyId}
ist optional, Sie sollten in der Lage sein, es zu unterlassen und erhalten die gleiche route Standardwerte, als Sie Ihren ersten registrierten route.Diese Weise würden Sie übereinstimmen, auf die
AccountArea
Namen der route erste, das ist, was Sie wollen, und dann, wenn ein{accountFriendlyId}
ist nicht angegeben, so behandeln würde, das erste token nach der Fläche als controller.In der Tat, ich fühle mich wie Sie sollten in der Lage sein, entfernen Sie die ersten beiden Routen komplett und just-stick mit der letzten, da die ersten beiden Parameter der route sind optional und die Standardeinstellungen sind identisch.
UPDATE
Da die
{accountFriendlyId}
könnte sein, einen gültigen controller-Betrieb-Namen, die Sie tun könnten, mit ein paar anderen Sachen:{accountFriendlyId}
an das Ende der route, statt am Anfang. Es folgt eine mehr Natürliche URL-Stil weitesten Ressource zu bestimmten Details innerhalb der Ressource.Kontext.MapRoute(
);
Area/Controller/Action
füllen würde die freundliche id-Parameter und schicken Sie mir auf der Standard-controller und-Aktion undArea/friendly/Controller/Action
scheitern würdeAh, sorry, ich habe dich nicht verstanden, dass
{accountFriendlyId}
wäre eine gültige operation name. Ich werde aktualisieren, die Antwort.Was ist die Konvention, wie diese strings werden geparst? Ich hatte keine Ahnung, dass Sie tun können, es inline mit einem literal (ich wahrscheinlich wird nicht verwenden Sie für diese im besonderen).
Es benutzt nur standard-syntax für reguläre Ausdrücke.
sollte nicht die
new { controller = @"(Account|Profile|Maintenance)" }
bewegt werden, um die nächsteconstraints
parameter, nicht ein Teil vondefaults
?InformationsquelleAutor Brandon Linton
Letztlich zu erleichtern, was ich wollte (das war abhängig von der app dynamisch unterscheiden zwischen beliebigen Saiten-und controller-Namen) habe ich eingerichtet, Routen wie diese:
Eingerichtet und eine Einschränkung wie diese (die Einschränkung könnte auch als
NotControllerNameContraint
):Credits: https://stackoverflow.com/a/1152735/938472
InformationsquelleAutor nik.shornikov
Dies ist ein URL-Raum-Problem. Wie wollen Sie unterscheiden zwischen einer accountFriendlyId, ein campaignFriendlyId und einem controller ? Der einfache Weg ist, um Sie in verschiedenen Segmenten der URL, aber mit dem Strecken kann ein controller sein, eine zweite, Dritte oder her-segment. Verwenden Sie Einschränkungen, um keine Verwechslungen, und bestellen Sie wie folgt:
Die Idee, die Sie vorgeschlagen, wenn ein controller nicht gefunden wird, dann versuchen Sie die nächste passende route ist, es funktioniert nicht so, sobald eine passende route vorhanden ist, ist es, Sie müssten die
UrlRoutingModule
zu versuchen, die Arbeit.IAreaController
zwischenIController
und die Verantwortlichen in diesem Bereich?Ich bin mir nicht sicher, was Sie reden, Sie aufbauen wollen, die Einschränkungen dinamically?
ja --
Assembly.GetCallingAssembly().GetTypes().Where(type => type.IsSubclassOf(typeof(IController)))
InformationsquelleAutor Max Toro