Domanda

Mi piacerebbe avere gli URL che sono ancora più breve di / {controller} / {Azione} / {Id}.

Per esempio, mi piacerebbe {controller} / {Id}, dove {Id} è una stringa.

Ciò consentirebbe di percorsi semplici, per esempio Users / nomeutente, Pages / Pagename, Notizie / Newsname. Mi piace questo meglio che richiede l'azione / Dettagli nella URL (Utenti / Dettagli / Username), che è meno elegante per l'utente finale.

Posso facilmente fare questo lavoro attraverso la creazione di percorsi personalizzati per qualsiasi controllore che voglio questo livello di semplicità per. Tuttavia, questo provoca mal di testa quando si tratta di attuare altre azioni, come ad esempio {controller} / {Azione}, dove {Azione} = 'Crea', dal momento che, in questo caso la stringa {azione} conflitti con la stringa {Id}.

La mia domanda: come posso avere 'riservato' parole, in modo che se l'URL è / News / Crea, viene trattato come un'azione, ma se l'URL è ogni altra cosa, per esempio / News / A-gorilla-ate-my-tesi, allora è trattato come un Id.

Spero che posso definire questo quando si imposta miei percorsi?

Aggiornamento:

Utilizzando la risposta di Ben Griswold, ho aggiornato il default ASP.NET MVC percorsi per essere:

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

Questo funziona un fascino e mezzo, per impostazione predefinita, le pagine dettagli saranno utilizzano l'URL semplificata, ma sarà ancora in grado di indirizzare una specifica azione se voglio (update / delete / dettagli).

Naturalmente, è necessario disabilitare la parola riservata "Crea" come ID, altrimenti un utente può cercare di creare un articolo, ad esempio, con il nome "Crea", che non può mai essere raggiunta.

Questa è veramente bello. Se uno vede che c'è qualcosa di sbagliato in questo approccio, carillon, ma mi piace finora.

È stato utile?

Soluzione

Credo che si è lasciato con la creazione di un percorso per ogni parola riservata. Ad esempio,

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

avrebbe gestito / News / Crea, / Users / Creare, ecc Finché questo percorso è elencato prima del tuo altro itinerario personalizzato, penso che tu sia coperto.

Immagino avrete bisogno di percorsi di addizione per le varie operazioni CRUD che seguiranno uno schema simile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top