10

ho il seguente codice HTML:Utilizzando Html.ActionLink con RouteValues ​​

<%: Html.ActionLink(item.ProductName, "Details", "Product", new { item.ProductId }, null)%> 

questo viene reso come:

<a href="/Product/Details?ProductId=1">My Product Name</a> 

Tuttavia, quando si fa clic su questo, ottengo il seguente errore:

The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Details(Int32)' in 'MyProject.Controllers.ProductController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.

Parameter name: parameters

Sembra che al mio routing non piaccia la stringa di query "? ProductId = 1".

Se uso invece:

<%: Html.ActionLink(item.ProductName, string.Format("Details/{0}", item.ProductId), "Product", null, null)%> 

ottengo il seguente link reso:

<a href="/Product/Details/1">My Product Name</a> 

... e questo funziona correttamente quando si fa clic.

Mi manca qualcosa di base qui? Mi piacerebbe utilizzare RouteValues, ma non capisco perché questo errore viene generato. Come posso ottenere che il mio metodo Controller accetti i parametri della stringa di query?

L'unica mappatura percorso che ho è:

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

risposta

10

Modificare il parametro ricorso sia Int ProductId.

public ActionResult Details(int productId) 
{ 
    return View(""); 
} 

il controller deve ottenere un parametro "id" perché ha dichiarato come non int nullable in modo che quando si invia productId ancora non corrisponde alla firma della funzione.
quando non si specifica il nome del parametro, le impostazioni predefinite di routing nel global.asax cambiare il nome del parametro di id:

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

vedere l'ultima riga.

+1

Oppure ... se posso aggiungere un "id =" al parametro RouteValues: <% = Html.ActionLink (item.ProductName, "Dettagli", "prodotto", nuova {id = item.ProductId}, null)%> Poi ho il seguente link: My Product Name ... che funziona anche! – seanfitzg

+0

@seanfitzg, hai ragione, ma suppongo che tu non voglia che tutti i nomi dei tuoi parametri siano "Id" ... – gdoron

1

Si sta impostando il personaggio / come separatori tra il controller, l'azione e l'id (parametri) se si chiama un URL come /Product/Details?ProductId=1 si sta chiamando il controller Product ma l'azione con il testo Details?ProductId=1 e poi instradamento hasn' t ottenere il prossimo /.

+0

Sfortunatamente, il metodo MapRoute non accetta "?" personaggi nel routing. – seanfitzg

Problemi correlati