ASP.NET MVC-컨트롤러에 매개 변수 전달


105

다음과 같은 작업 방법이있는 컨트롤러가 있습니다.

public class InventoryController : Controller
{
    public ActionResult ViewStockNext(int firstItem)
    {
        // Do some stuff
    }
}

그리고 그것을 실행하면 다음과 같은 오류가 발생합니다.

매개 변수 사전에 매개 변수 'firstItem'에 대한 'System.Int32'형식의 유효한 값이 없습니다. 매개 변수를 선택적으로 만들려면 해당 유형이 참조 유형이거나 Nullable 유형이어야합니다.

나는 한 지점에서 작동하고 매개 변수없이 기능을 시도하기로 결정했습니다. 컨트롤러가 영속적이지 않다는 것을 알게 된 나는 매개 변수를 다시 넣었는데, 이제 메소드를 호출 할 때 매개 변수를 인식하지 못합니다.

이 URL 구문을 사용하여 작업을 호출하고 있습니다.

http://localhost:2316/Inventory/ViewStockNext/11

이 오류가 발생하는 이유와이를 수정하기 위해 수행해야하는 작업에 대한 아이디어가 있습니까?

클래스에 정수를 사용하는 다른 메서드를 추가하려고 시도했지만 같은 이유로 실패합니다. 문자열을 취하는 것을 추가하려고 시도했으며 문자열이 null로 설정되었습니다. 매개 변수없이 하나를 추가하려고 시도했지만 제대로 작동하지만 물론 내 요구에 맞지 않습니다.

답변:


106

라우팅은의 라인을 따라 설정되어야합니다 {controller}/{action}/{firstItem}. 기본값으로 라우팅을두면 {controller}/{action}/{id}당신의 global.asax.cs파일, 당신은 전달해야합니다 id.

routes.MapRoute(
    "Inventory",
    "Inventory/{action}/{firstItem}",
    new { controller = "Inventory", action = "ListAll", firstItem = "" }
);

... 또는 그에 가까운 것.


44
또는 그냥 "ID"를 "firstItem과"이름 바꾸기
카일 Trauberman

8
또한 다음과 같이 MapRoute에 제약 객체를 추가하는 것이 현명합니다 new { firstItem = @"\d" }. 이렇게 하면 매개 변수가 어떤 종류의 숫자 인 경우 에만 허용됩니다. 원하는대로 정규식을 수정할 수 있으며 다음과 같이 소수 자릿수를 제한 new { firstItem = @"\d{4}" }할 수도 있습니다.-이제 4 자리 숫자 만 가능합니다. 편집 : 완전히 수정 된 MapRoute의 예 : jsfiddle.net/HJRgT
KristianB

86

firstItem을 id로 변경할 수 있으며 작동합니다.

global.asax에서 라우팅을 변경할 수 있습니다 (권장하지 않습니다)

그리고 아무도 이것을 언급하지 않았다는 것을 믿을 수 없습니다.

http://localhost:2316/Inventory/ViewStockNext?firstItem=11

@ Url.Action에서 다음과 같습니다.

@Url.Action("ViewStockNext", "Inventory", new {firstItem=11});

하는 일의 유형에 따라 마지막이 더 적합 할 것입니다. 또한 ViewStockNext 작업을 수행하지 않고 대신 인덱스가있는 ViewStock 작업을 고려해야합니다. (내 2 센트)


15

바꾸어 말하면 자렛 메이어의 답변을 , 당신은 'ID'로 매개 변수 이름을 변경하거나이 같은 경로를 추가해야합니다 :

routes.MapRoute(
        "ViewStockNext", // Route name
        "Inventory/ViewStockNext/{firstItem}",  // URL with parameters
        new { controller = "Inventory", action = "ViewStockNext" }  // Parameter defaults
    );

그 이유는 기본 경로가 매개 변수가 없거나 'id'라는 매개 변수가있는 작업 만 검색하기 때문입니다.

편집 : 헤, 결코 신경 쓰지 않는 Jarret은 게시 후 경로 예제를 추가했습니다.


8

또는 경로 속성으로 수행하십시오.

public class InventoryController : Controller
{
    [Route("whatever/{firstItem}")]
    public ActionResult ViewStockNext(int firstItem)
    {
        int yourNewVariable = firstItem;
        // ...
    }
}

이 속성은 이전 MVC 버전에서 작동하지 않을 수 있습니다.
Suat Atan PhD

또한이 작업을 수행하려면 routes.MapMvcAttributeRoutes();응용 프로그램의 RegisterRoutes(RouteCollection)메서드 내에서 호출했는지 확인해야합니다 (일반적으로 App_Start \ RouteConfig.cs에 스캐 폴딩 됨). 기본적으로 거기에 없을 수 있습니다.
Daniel Scott

7

Headspring은 액션의 속성에서 매개 변수에 별칭을 추가 할 수있는 멋진 라이브러리를 만들었습니다. 이것은 다음과 같습니다.

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

이를 통해 다른 매개 변수 이름을 처리하기 위해 라우팅을 변경할 필요가 없습니다. 라이브러리는 또한 여러 번 적용을 지원하므로 여러 매개 변수 철자를 매핑 할 수 있습니다 (퍼블릭 인터페이스를 손상시키지 않고 리팩토링 할 때 편리함).

Nuget 에서 얻을 수 있으며 여기 에서 Jeffrey Palermo의 기사를 읽을 수 있습니다.


7

public ActionResult ViewNextItem(int? id)id정수를 nullable 형식으로 만들고 string <-> int 변환이 필요하지 않습니다.


3

ASP.NET Core 태그 도우미 기능 사용 :

<a asp-controller="Home" asp-action="SetLanguage" asp-route-yourparam1="@item.Value">@item.Text</a>

아이러니하게도 가장 짧은 대답이 최고입니다 (이것).

1

이를 수행하는 또 다른 방법이 있습니다 (Stephen Walther의 Pager 예제 에서 자세히 설명 됨).

기본적으로보기에 링크를 만듭니다.

Html.ActionLink("Next page", "Index", routeData)

routeData에서 이름 / 값 쌍 (예 : routeData [ "page"] = 5)을 지정할 수 있으며 컨트롤러 Index 함수에서 해당 매개 변수가 값을 수신합니다. 그건,

public ViewResult Index(int? page)

것이다 페이지는 내가 인정해야한다 (5)로 전달, 그것은 문자열 ( "페이지") 자동적으로 변수가됩니다 것을 매우 드문 -하지만 MVC가 아니라 다른 언어에서 작동하는 방법 그건 ...


0

"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" });

0

또는 매개 변수 유형을 문자열로 변경 한 다음 메소드에서 문자열을 정수로 변환 할 수 있습니다. 저는 MVC를 처음 사용하지만 매개 변수 목록에 nullable 개체가 필요하다고 생각합니다. 컨트롤러가 그러한 매개 변수가 제공되지 않았 음을 어떻게 표시합니까? 그래서...

public ActionResult ViewNextItem(string id)...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.