Frage

Ich möchte URLs haben, die noch kürzer sind als/{Controller}/{action}/{id}.

Zum Beispiel hätte ich {Controller}/{id}, wobei {id} eine Zeichenfolge ist.

Dies würde einfache Pfade, z. B. Benutzer/Benutzername, Seiten/Pagename, News/NewsName ermöglichen. Ich mag dies besser, als die Aktion/Details in der URL (Benutzer/Details/Benutzername) zu verlangen, was für den Endbenutzer weniger elegant ist.

Ich kann diese Arbeit problemlos machen, indem ich benutzerdefinierte Routen für jeden Controller einrichten, für den ich diese Einfachheit wünsche. Dies führt jedoch zu Kopfschmerzen, wenn es darum geht, andere Aktionen wie {Controller}/{action} zu implementieren, wobei {action} = 'create', da in diesem Fall die String {action} mit der String {id} in Konflikt steht.

Meine Frage: Wie kann ich "reservierte" Wörter haben, so dass, wenn die URL /Nachrichten /Erstellen ist, als Aktion behandelt wird, aber wenn die URL etwas anderes ist, z. B. /a-gorilla-ate-my- These, dann wird es als ID behandelt.

Ich hoffe, ich kann das beim Einrichten meiner Routen definieren?

Aktualisieren:

Mit der Antwort von Ben Griswold habe ich die Standard -ASP.NET -MVC -Routen aktualisiert:

    routes.MapRoute(
    "CreateRoute",                                            // route name
    "{controller}/Create",                                    // url with parameters
    new { action = "Create" }                                 // parameter defaults
);

routes.MapRoute(
    "DetailsRoute",                                           // route name
    "{controller}/{id}",                                      // url with parameters
    new { action = "Details" }                                // parameter defaults
);

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

Dies arbeitet einen Charme und bedeutet standardmäßig, dass die Detailseiten die vereinfachte URL verwenden, aber ich werde weiterhin in der Lage sein, eine bestimmte Aktion anzusprechen, wenn ich möchte (aktualisieren/löschen/Details).

Natürlich müssen Sie das reservierte "Wort erstellen" als ID nicht zulassen. Andernfalls kann ein Benutzer versuchen, einen Artikel mit dem Namen "Erstellen" zu erstellen, auf den niemals zugegriffen werden kann.

Das ist wirklich schön. Wenn jemand sieht, dass mit diesem Ansatz etwas nicht stimmt, klopfen Sie sich ein, aber ich mag es bisher.

War es hilfreich?

Lösung

Ich denke, für jedes reservierte Wort erstellen Sie eine Route. Zum Beispiel,

routes.MapRoute("CreateRoute",
               "{controller}/Create",
                new { action = "Create" }
            );

Würde /Nachrichten /Erstellen, /Benutzer /Erstellen usw., solange diese Route vor Ihrer anderen benutzerdefinierten Route aufgelistet ist, denke ich, dass Sie abgedeckt sind.

Ich kann mir vorstellen, dass Sie Additionsrouten für verschiedene CRUD -Operationen benötigen, die einem ähnlichen Muster folgen.

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