[英]ASP.NET MVC - passing parameters to the controller
我有一個具有操作方法的控制器,如下所示:
public class InventoryController : Controller
{
public ActionResult ViewStockNext(int firstItem)
{
// Do some stuff
}
}
當我運行它時,我得到一個錯誤說明:
參數字典對於參數“ firstItem”不包含類型為“ System.Int32”的有效值。 要使參數成為可選參數,其類型應為引用類型或Nullable類型。
我曾經在某一點上工作過,於是決定嘗試不帶參數的功能。 發現控制器不是持久性的,我將參數放回去,現在當我調用方法時它拒絕識別參數。
我正在使用以下url語法來調用操作:
http://localhost:2316/Inventory/ViewStockNext/11
有什么主意為什么會出現此錯誤以及我需要做什么來解決它?
我試過在類中添加另一個采用整數的方法,但由於相同的原因它也會失敗。 我嘗試添加一個需要一個字符串的字符串,並且該字符串設置為null。 我嘗試添加一個不帶參數的方法,效果很好,但當然不適合我的需求。
您需要按照{controller}/{action}/{firstItem}
的路線來設置路由。 如果您在global.asax.cs
文件中將路由保留為默認的{controller}/{action}/{id}
,則需要傳遞id
。
routes.MapRoute(
"Inventory",
"Inventory/{action}/{firstItem}",
new { controller = "Inventory", action = "ListAll", firstItem = "" }
);
...或類似的東西。
您可以將firstItem更改為id,它將起作用
您可以在global.asax上更改路由(我不建議這樣做)
而且,不敢相信沒有人提到這一點,您可以致電:
http://localhost:2316/Inventory/ViewStockNext?firstItem=11
在@ Url.Action中將是:
@Url.Action("ViewStockNext", "Inventory", new {firstItem=11});
根據您的工作類型,最后一個會更合適。 另外,您應該考慮不執行ViewStockNext操作,而是執行帶索引的ViewStock操作。 (我的2美分)
要改寫Jarret Meyer的答案 ,您需要將參數名稱更改為'id'或添加如下所示的路由:
routes.MapRoute(
"ViewStockNext", // Route name
"Inventory/ViewStockNext/{firstItem}", // URL with parameters
new { controller = "Inventory", action = "ViewStockNext" } // Parameter defaults
);
原因是默認路由僅查找沒有參數或名為“ id”的參數的操作。
編輯:嘿,沒關系Jarret發布后添加了一個路線示例。
public ActionResult ViewNextItem(int? id)
使id
整數成為可為null的類型,無需進行string <-> int轉換。
或使用Route Attribute:
public class InventoryController : Controller
{
[Route("whatever/{firstItem}")]
public ActionResult ViewStockNext(int firstItem)
{
int yourNewVariable = firstItem;
// ...
}
}
使用ASP.NET Core標記幫助器功能:
<a asp-controller="Home" asp-action="SetLanguage" asp-route-yourparam1="@item.Value">@item.Text</a>
還有另一種方法可以做到這一點(在Stephen Walther的Pager示例中有更詳細的描述
本質上,您可以在視圖中創建一個鏈接:
Html.ActionLink("Next page", "Index", routeData)
在routeData中,可以指定名稱/值對(例如,routeData [“ page”] = 5),並且在控制器的Index函數中,相應的參數將接收該值。 那是,
public ViewResult Index(int? page)
將以5傳遞頁面 。我必須承認,字符串(“頁面”)自動變為變量是非常不尋常的-但這也是MVC在其他語言中的工作方式...
或者,您可以嘗試將參數類型更改為字符串,然后在方法中將字符串轉換為整數。 我是MVC的新手,但我相信您需要在參數列表中添加可為空的對象,否則控制器將如何指示未提供此類參數? 所以...
public ActionResult ViewNextItem(string id)...
特殊對待“ id”的原因是將其添加到默認路由映射中。 要更改此設置,請轉到Global.asax.cs,您將找到以下行:
routes.MapRoute ("Default", "{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" });
更改為:
routes.MapRoute ("Default", "{controller}/{action}",
new { controller = "Home", action = "Index" });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.