Domanda

qui ci sono due percorsi dal mio file Global.asax. Sto cercando di andare al secondo percorso e sto diventando una risorsa di default 404 non trovato errore.

Quando rimuovo il primo itinerario (elencati in questo esempio), funziona.

Come posso risolvere questo problema, per favore?

frammento di codice global.asax

// GET: /user/PureKrome/Alert/69
routes.MapRoute(
    "User-Alert-Details",
    "user/{displayName}/alert/{alertId}",
    new { controller = "Account", action = "AlertDetails", alertId = 0 });

// GET: /user/PureKrome/Alert/create
routes.MapRoute(
    "User-Alert-Create",
    "user/{displayName}/alert/create",
    new { controller = "Account", action = "AlertCreate" });
È stato utile?

Soluzione

Il primo percorso è un percorso "goloso" e sarà lieto di accettare "creare" come alertId nell'ultimo parametro. Sembra che si intende il parametro alertId essere solo numerico, così si dovrebbe aggiungere un vincolo per dire al sistema percorso che quel ultimo parametro deve essere numerico.

esercitazione .

Ad esempio:

// GET: /user/PureKrome/Alert/69
routes.MapRoute(
    "User-Alert-Details",
    "user/{displayName}/alert/{alertId}",
    new { controller = "Account", action = "AlertDetails", alertId = 0 },
    new { alertId = @"\d+" });

// GET: /user/PureKrome/Alert/create
routes.MapRoute(
    "User-Alert-Create",
    "user/{displayName}/alert/create",
    new { controller = "Account", action = "AlertCreate" });

Nota, si può anche invertire l'ordine dei percorsi, ma anche se lo fate, si dovrebbe comunque includere un vincolo per la correttezza, se si desidera alertId per essere sempre un numero.

Altri suggerimenti

Si desidera che i percorsi da definire viceversa in modo che la corrispondenza esatta su create viene prima della partita non vincolata per alertId. Che, o è possibile aggiungere un vincolo per /user/PureKrome/Alert/create come affermato da Twisty Maze.

Questo perché il percorso funziona cercando di abbinare i percorsi da cima a fondo. User-Alert-Details corrisponde sulla User-Alert-Create percorso come pensa <=> è il valore per <=>. Con loro il passaggio intorno ad esso corrisponde solo il <=> percorso se il 4 ° segmento è esplicitamente <=> e cadrà attraverso <=> se non lo fa.

Per chiarezza, dovrebbero lavorare in questo modo per aggirare:

// GET: /user/PureKrome/Alert/create
routes.MapRoute(
    "User-Alert-Create",
    "user/{displayName}/alert/create",
    new { controller = "Account", action = "AlertCreate" });

// GET: /user/PureKrome/Alert/69
routes.MapRoute(
    "User-Alert-Details",
    "user/{displayName}/alert/{alertId}",
    new { controller = "Account", action = "AlertDetails", alertId = 0 });  

Se avete un altro problema come questo, provare debugger url di Phil Haack all'indirizzo http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

Il problema è che hai specificato i valori predefiniti per controllo e le azioni nel primo Mapping.

Ora, qualsiasi richiesta in ingresso viene gestito dal primo percorso, se il nome del controller è presente, il suo sostituito dal valore di default e se il nome di azione che manca è sostituito anche dal valore di default.

Quindi, in realtà quando si dice http: // localhost / SomeRoute Il primo mapper entra in azione e considera la stringa "SomeRoute" come nome Controller, allora non trova l'azione in modo che utilizza l'azione predefinita si è specificato che è "AlertCreate" nel tuo esempio. Così ora il mapper cerca di trovare un'azione chiamata AlertCreate nel controller "SomeRoute".

La linea di fondo è la seconda mappatura non calci in azione perché la prima mappatura sta gestendo tutta la vostra richiesta di routing. (Perché avete valori predefiniti specificati)

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