10

Tôi có Html sau:Sử dụng Html.ActionLink với RouteValues ​​

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

này đã được render thành:

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

Tuy nhiên, khi tôi bấm vào đây, tôi nhận được lỗi sau:

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

Dường như định tuyến của tôi không giống chuỗi truy vấn "? ProductId = 1".

Nếu tôi sử dụng thay vì:

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

tôi nhận được đường dẫn sau hiển thị:

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

... và các công trình này một cách chính xác khi nhấp vào.

Tôi có thiếu cái gì cơ bản ở đây không? Tôi muốn sử dụng RouteValues, nhưng tôi không hiểu tại sao lỗi này lại bị ném. Làm thế nào tôi có thể nhận được phương pháp điều khiển của tôi để chấp nhận các tham số chuỗi truy vấn?

Việc lập bản đồ đường duy nhất tôi có là:

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

Trả lời

10

Thay đổi thông số hành động được int ProductID.

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

điều khiển của bạn có để có được một "id" tham số bởi vì bạn tuyên bố nó như không nullable int vì vậy khi bạn gửi productId nó vẫn không khớp với chữ ký chức năng.
khi bạn không chỉ định tên tham số, giá trị mặc định định tuyến trong global.asax thay đổi tên tham số id:

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

thấy dòng cuối cùng.

+1

Hoặc ... nếu tôi thêm "id =" vào thông số RouteValues: <% = Html.ActionLink (item.ProductName, "Chi tiết", "Sản phẩm", mới {id = item.ProductId}, null)%> Sau đó, tôi nhận được liên kết sau: My Product Name ... cũng hoạt động! – seanfitzg

+0

@seanfitzg, bạn nói đúng, nhưng tôi đoán bạn không muốn tất cả tên tham số của bạn là "Id" ... – gdoron

1

Bạn đang thiết lập ký tự / như dải phân cách giữa bộ điều khiển, hành động và id (các thông số) nếu bạn gọi một url như /Product/Details?ProductId=1 bạn đang gọi controller Product nhưng hành động với các văn bản Details?ProductId=1 và sau đó định tuyến hasn' t nhận được / tiếp theo.

+0

Thật không may, phương thức MapRoute không chấp nhận "?" ký tự trong định tuyến. – seanfitzg

Các vấn đề liên quan