簡體   English   中英

ASP.NET MVC-將參數傳遞給控制器

[英]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發布后添加了一個路線示例。

Headspring創建了一個不錯的庫,允許您在操作的屬性中為參數添加別名。 看起來像這樣:

[ParameterAlias("firstItem", "id", Order = 3)]
public ActionResult ViewStockNext(int firstItem)
{
    // Do some stuff
}

這樣,您不必更改路由就可以處理其他參數名稱。 該庫還支持多次應用它,因此您可以映射多個參數拼寫(在重構時非常方便,而不會破壞您的公共接口)。

您可以從Nuget獲取它,並在此處閱讀Jeffrey Palermo的文章。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM