2013-06-03 18 views
5

Sto cercando di impostare il routing personalizzato con il seguente itinerario mappatoasp.net-MVC: Dizionario parametri contiene una voce null per il parametro

edit: il mio percorso pieno config

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

     #region FixtureAdmin 

     routes.MapRoute(
      name: "FixtureEdit", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "FixtureAdmin", action = "Edit", id = UrlParameter.Optional } 
     ); 

     #endregion 

     #region Results 

     routes.MapRoute(
      name: "ResultAdd", 
      url: "{controller}/{action}/{fixtureId}", 
      defaults: new { controller = "Result", action = "Add", fixtureId = UrlParameter.Optional } 
     ); 

     #endregion 

E il mio controller codice

public ActionResult Add(int fixtureId) 
    { 
     // return model to view etc.. 
    } 

Si tratta di un'eccezione, anche se il parametro è stato specificato come facoltativo.

Il dizionario parametri contiene una voce null per il parametro 'fixtureId'

La cosa strana è, se cambio il parametro della action Aggiungi al solo 'Id' quindi il seguente URL funzionerà Risultato/Aggiungi/1. Sono confuso, c'è qualche routing predefinito che sta sovrascrivendo quello personalizzato? Perché cambiare il parametro in "Id" funziona?

Modifica

solo per testare, ho aggiunto un altro parametro all'azione

public ActionResult Add(int? fixtureId, int? testId) 

Ho poi modificato il percorso di conseguenza e ora funziona, quindi mi sa che è un problema con il routing di default .

+0

è il loro qualsiasi altro percorso configurato anche prima o dopo questo – rajansoft1

+1

Se si vuole essere in grado di chiamare 'Add' senza specificare l'id,' fixtureId' dovrebbe essere annullabile - 'int? fixtureId'. "Opzionale" nel contesto del percorso significa che non deve essere presente nell'URL, in modo che tu possa avere azioni come "public ActionResult Add() {/ * no parameters * /}' – Alex

+0

L'unica cosa che posso pensare è che stai usando un int che non è annullabile? L'id è probabilmente inserito nel framework MVC, quindi probabilmente funziona diversamente. – David

risposta

6

Utilizzare un valore null int all'interno dell'azione del controller.

public ActionResult Add(int? fixtureId) 
{ 
    // return model to view etc.. 
} 

Ma la domanda è, se questo è davvero un ID, come sarebbe reagito se un null/ID vuota viene richiesto dall'utente? Quell'ID è una chiave nel tuo DB? Puoi renderlo nullable se sei in grado di gestire o fornire una pagina predefinita se l'ID è vuoto/nullo.

EDIT:

Questo perché ASP.NET si supponga che un parametro non identificato nella richiesta è il id, nel tuo caso, Results/Add/1, 1 è identificato. Se vuoi far funzionare quel codice usando fixtureId, dovresti usare Results/Add?fixureId=1. Quindi, alla fine, non è a causa del routing, ma piuttosto, è a causa del parametro nell'azione che hai.

EDIT2:

Inoltre, quello che stai vivendo c'è chiamato un conflitto di routing. I percorsi sono in conflitto con lo Default. Puoi provare ad applicare constraints.

+0

Posso renderlo nullable e gestirlo di conseguenza. Il problema è quando effettivamente passo un valore in Risultato/Aggiungi/1 per esempio il valore passato è sempre nullo. – nik0lias

+0

controlla la mia modifica. – aiapatag

+1

Ok, sembra che sia sufficiente, volevo andare a nascondere i parametri dall'utente, se possibile, ma potrebbe essere necessario farlo pubblicando il modulo, grazie. – nik0lias

1

Osservare questo metodo per aggiungere quello che lo sviluppatore chiama "NullableConstraint" clicky link Quindi, se viene fornito il parametro opzionale, è possibile verificare il suo valore.

E anche guardare la risposta seguendo la risposta accettata per quello che sembra una soluzione più semplice, più pulita.

2

2, dal tuo post Credo che il problema è mettere il vostro itinerario personalizzato dopo di default, in questo modo:

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

     routes.MapRoute(
     name: "ResultAdd", 
     url: "{controller}/{action}/{fixtureId}", 
     defaults: new { controller = "Home", action = "Add", fixtureId = UrlParameter.Optional } 

così: 1/eccezione "Il dizionario dei parametri contiene una voce null per il parametro 'fixtureId "" arriverà se non si specifica il nome della rotta specifica per qualsiasi link di azione o modulo di instradamento perché MVC utilizzerà la route predefinita per il routing. Quindi è necessario dare uno specifico nome di percorso per il percorso personalizzato può essere lavorato, in questo modo:

@Html.ActionLink("Test custom Route", "Add", "Home", new { fixtureId = 1 }, "ResultAdd") 

Cheer

Problemi correlati