10

Tengo el siguiente código HTML:Html.ActionLink con RouteValues ​​

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

esto es ser traducido como:

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

Sin embargo, al hacer clic en este, me sale el siguiente error:

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

Parece que a mi enrutamiento no le gusta la cadena de consulta "? ProductId = 1".

Si utilizo en su lugar:

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

me sale el siguiente enlace prestados:

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

... y esto funciona correctamente cuando se hace clic.

¿Me falta algo básico aquí? Me gustaría utilizar RouteValues, pero no entiendo por qué se lanza este error. ¿Cómo puedo obtener mi método de controlador para aceptar los parámetros de cadena de consulta?

La única asignación de ruta que tengo es:

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

Respuesta

10

Cambiar el parámetro de acción sea int ProductId.

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

su controlador tiene que conseguir un parámetro "id", ya que lo declaró como no int anulable por lo que cuando se envía productId todavía no coincide con la firma de la función.
cuando no se especifica el nombre del parámetro, los valores por defecto de enrutamiento en el Global.asax cambiar el nombre del parámetro de Identificación:

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

ver la última línea.

+1

O ... si añado un "id =" al parámetro RouteValues: <% = Html.ActionLink (item.ProductName, "Detalles", "productos", nueva {id = item.ProductId}, null)%> Entonces me sale el siguiente enlace: My Product Name ... que también funciona! – seanfitzg

+0

@seanfitzg, tienes razón, pero supongo que no quieres que todos los nombres de los parámetros sean "Id" ... – gdoron

1

Usted está configurando el carácter / como separadores entre el controlador, la acción y el identificador (los parámetros) si se llama a una URL como /Product/Details?ProductId=1 que está llamando el controlador Product pero la acción con el texto Details?ProductId=1 y luego encaminar hasn' t obtener el siguiente /.

+0

Desafortunadamente, el método MapRoute no acepta "?" personajes en el enrutamiento. – seanfitzg

Cuestiones relacionadas