10

Mam następujące HTML:Korzystanie Html.ActionLink z RouteValues ​​

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

ten jest wyświetlany jako:

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

Jednak, gdy klikam na to, pojawia się następujący błąd:

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

Wygląda na to, że mój routing nie odpowiada ciągowi zapytania "? ProductId = 1".

Jeśli użyję zamiast:

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

otrzymuję poniższy link renderowany:

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

... i to działa poprawnie po kliknięciu.

Czy brakuje tu czegoś podstawowego? Chciałbym użyć RouteValues, ale nie rozumiem, dlaczego ten błąd jest zgłaszany. Jak mogę przekonać się, że moja metoda kontrolera akceptuje parametry ciągu zapytania?

Jedynym wyznaczania tras mam to:

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

Odpowiedz

10

zmienić parametr action być int ProductId.

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

kontroler musi uzyskać parametr „id”, ponieważ zadeklarowane jako nie pustych int więc podczas wysyłania ProductId nadal nie pasuje do podpisu funkcji.
kiedy nie podać nazwę parametru, domyślnie routingu w global.asax zmienić nazwę parametru do id:

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

patrz ostatni wiersz.

+1

Lub ... jeśli dodaję "id =" do parametru RouteValues: <% = Html.ActionLink (item.ProductName, "Details", "Product", new {id = item.ProductId}, null)%> Następnie pojawia się następujący link: My Product Name ... który również działa! – seanfitzg

+0

@seanfitzg, masz rację, ale myślę, że nie chcesz, aby wszystkie twoje parametry były "Id" ... – gdoron

1

ustawiania znaku / jako separatory między kontrolerem, działania i ID (parametry) Jeśli zadzwonisz url jak /Product/Details?ProductId=1 dzwonisz kontroler Product ale działanie z tekstem Details?ProductId=1 a następnie routingu Hasn” t uzyskać następny /.

+0

Niestety, metoda MapRoute nie akceptuje "?" znaki w routingu. – seanfitzg

Powiązane problemy