10

我有以下HTML:使用Html.ActionLink與RouteValues

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

這是正在呈現爲:

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

然而,當我點擊這個,我得到以下錯誤:

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

看起來我的路由不喜歡「?ProductId = 1」查詢字符串。

如果我使用來代替:

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

我得到呈現以下鏈接:

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

...並點擊時這正常工作。

我在這裏錯過了一些基本的東西嗎?我想使用RouteValues,但我不明白爲什麼會拋出這個錯誤。我怎樣才能讓我的Controller方法接受查詢字符串參數?

唯一的路由映射我是:

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

回答

10

更改操作參數爲int產品編號。

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

控制器有,因爲你宣佈它作爲可空INT所以,當你發送的productId它仍然不匹配函數簽名獲得一個「ID」參數。
當你不指定參數名,在Global.asax路由默認參數更改名稱ID:

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

看到的最後一行。

+1

或...如果我添加一個 「id =」 到RouteValues參數: <%= Html.ActionLink(item.ProductName, 「詳細信息」, 「產品」,新{ID = item.ProductId}, null)%> 然後,我得到以下鏈接: My Product Name ......這也有效! – seanfitzg

+0

@seanfitzg,你是對的,但我想你不希望你所有的參數名稱都是「Id」... – gdoron

1

您正在設置/字符作爲控制器,動作和ID(參數)如果你調用一個網址像/Product/Details?ProductId=1您呼叫控制器Product但與文本Details?ProductId=1的動作,然後路由不是招」之間的分隔符t得到下一個/

+0

不幸的是,MapRoute方法不接受「?」字符在路由中。 – seanfitzg