2010-03-17 5 views
10

ASP.net MVC를 사용하면 폼에 있지만 URL에없는 매개 변수를 포함하는 컨트롤러 동작에 양식을 게시 할 수 있습니까? 예를 들어ASP.NET MVC - URL의 추가 매개 변수가있는 POST 작업 메서드

GroupController의 작업 방법 :

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(int idOne, int idTwo, Model model) 
    { ... } 

가 경로 :

"{controller}/{action}/{idOne}/{idTwo}" 

게시 URL :이 예에서

/Employee/Show/1/42 

이 양식은 에 게시 중 다른 컨트롤러, 모델은 올바른 값을 가지고 있지만 다른 매개 변수는 기본값이 0입니다.

내가 예상했던 동작은 ModelBinder가 주어진 경로와 일치하는 두 개의 매개 변수를 가지고 있으며 현재 GET 연산과 동일한 방식으로 매개 변수에 1과 42의 값을 전달합니다.

이 동작은 지원되지 않습니까? 아니면 뭔가 빠졌습니까?

편집 : 컨트롤러 Employee에 대한 Show보기의 양식은 다른 컨트롤러에 게시 된 양식을 포함, 명확하게합니다. 우리는 그것을 Group라고 부를 수 있습니다. 매개 변수가 경우에만 형태로 매핑하는 것을 내가 찾은 Html.BeginForm에 대한 다양한 오버로드를 시도 후

Html.BeginForm("Create", "Groups") 

을 다음과 같이

은 양식 조치 URL은 양식 선언이

/Groups/Create/0/0 

처럼 보인다 액션 URL은 브라우저 주소창의 현재 URL과 일치합니다.

URL /Groups/Create/1/42으로 이동하면 새 양식이 생깁니다. 그런 다음 양식을 제출하면 URL 경로 값이 POST 작업에 전달됩니다.

+2

내가 모델을 포함하도록 경로를 정의하고 널 (null)의 기본값으로 설정을 시도하고 어떻게 볼 것입니다 작동합니다. {컨트롤러}/{액션}/{idOne}/{idTwo}/{모델}' –

답변

8

질문을 올바르게 이해하면 <form> 요소의 action 요소가 경로 값을 포함하는 URL을 가리 키기를 원합니다.

Html.BeginForm("action","controller", new { idOne=1, idTwo=2 }, FormMethod.Post); 

가 나는 경우에만 폼 데이터를 게시 할 수 있음을 확신

+0

일종의. 내가 질문에 언급했듯이 for 액션에는 올바른 경로 값 (예에서 1과 42)이 포함 된 URL이 이미 포함되어 있습니다. 문제는 실행 작업에 들어가면 두 매개 변수의 값이 0입니다. 제안을 시도했지만 값은 여전히 ​​0입니다. – Karl

2

: 모든 잘못 질문을 가지고 알려줘 :이 HtmlHelper.BeginForm() 확장 메서드의 오버로드 중 하나를 수 있어야한다 폼 안의 입력으로부터. URL에서 양식 입력 값을 생성하는 방식으로보기를 렌더링하는 것을 고려 했습니까 (HTML 도우미 포함)?

업데이트 : 양식을 전혀 사용하지 않으려면 방법 서명을 통해 양식을 전달하는 대신 ControllerContext.RouteData.Values["idOne"]을 사용하십시오.

+0

양식 내에서 경로 값에 대한 쿼리를 만들었습니다. ViewContext.RouteData.Values ​​[ idOne "], 그러나 최종 렌더링 페이지의 값은 경로의 값이 아니라 0입니다. 보기/부분 내에서 현재 URL 경로 값을 가져 오는 다른 방법이 있습니까? – Karl

+0

Html 도우미 확장 프로그램을 사용하는 경우 도우미 인스턴스 자체에서이를 볼 수 있어야합니다. 구문은'helper.ViewContext.RouteData.Values ​​[ "idOne"]'와 같습니다. 또는 ID 모델 값을 뷰 모델에 저장하고이를 뷰에 전달할 수도 있습니다. –

+0

+1 같은 생각. 왜 그것을 Html.BeginForm ("Create", "Groups") 내의 숨겨진 필드로 값에 포함시키지 않습니까? 또한, 새로운 양식을 만들기 위해 '게시'해야합니까? – Ahmad

0

나는 최근에 너무이 문제를 가지고 있었고, 내가 다른 경로를했기 때문에,이 계정으로 내가 전달 된 여분의 경로 PARAMS을 복용하지 않고, 기본 경로에 매핑이었다. 그래서

이 작업을 얻을 빨리 양식 태그를 사용하여 양식을 작성하고 @ Url.Action을 사용하여 필요한 작업을 만들었습니다.

0

일단 작성보기가되면 거기에 도착하는 데 사용 된 경로 값을 사후 조치에 다시 게시해야합니다.

그래서 하나의 옵션은 경로에서 나온 ID를 보유하기 위해 한 쌍의 히든을 가지고 있습니다. 이렇게하면 formas를 게시하면 해당 값이 다른 입력과 함께 전기됩니다.

0

비슷한 문제가 있었지만 RouteConfig 구성이이 문제를 해결했습니다.

public class RouteConfig 
    { 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
      ... 
      routes.MapRoute(
      "MyRoute", 
      "{controller}/{action}/{idOne}/{idTwo}", 
      new 
      { 
       controller = "Employee", // as an example 
       action = "Show", 
       idOne = UrlParameter.Optional, 
       idTwo= UrlParameter.Optional 
      }, new { idOne = @"\d{1,5}" }); 

     } 
    } 

... 그리고 ... Html.BeginRouteForm()

@using (Html.BeginRouteForm("MyRoute", new { idOne = 1, idTwo= 2 }, FormMethod.Post)) 

응답에 개구 태그를 쓴다. 사용자가 양식을 제출하면 요청은 경로 대상에 의해 처리됩니다. 이 멤버가 오버로드되었습니다. 이 멤버에 대한 전체 정보 (구문, 사용법 및 예제가 포함 된 )를 확인하려면 오버로드 목록의 이름을 클릭하십시오.

그리고 모든

관련 문제