1

내 프로젝트에서 RouteAttributes를 사용하고 있는데이 경우를 제외하고는 올바르게 작동합니다. 두 개의 비슷한 동작이 있는데 한 개는 두 개의 int 매개 변수를 허용하고 다른 한 개는 다른 동작 하나만 받아 들인다.RedirectToAction이 잘못된 url (routedata param 대신 querystring 매개 변수)을 생성합니다.

첫 번째 매개 변수는 두 매개 변수를 사용하여 개체를로드하고이를보기에 전달합니다. 두 번째 변수는 두 번째 변수에 대한 기본값을 찾으려고 시도하고 첫 번째 작업으로 리디렉션하여 두 변수를 전달합니다.

ActionResultExample(int idVar1)에있는 문제는 ControllerExample/Edit/idVar1/Brands/idVar2으로 리디렉션 될 것으로 예상됩니다. 그러나 나는 ControllerExample/Edit/idVar1/Brands?idVar2=idVar2으로 리다이렉트되었다. 이것은 물론 무한 리다이렉션 루프를 생성합니다.

[Route("ControllerExample/Edit/{idVar1}/Brands/{idVar2}")] 
    public ActionResult ActionResultExample(int idVar1, int idVar2) 
    { 
     var objectForView= ObjectController.Get(idVar1, idVar2); 

     return View("ActionResultExample", objectForView); 
    } 

    [Route("ControllerExample/Edit/{idVar1}/Brands")] 
    public ActionResult ActionResultExample(int idVar1) 
    { 
     ... 
     var idVar2 = getDefaultVar2(); 
     return RedirectToAction("ActionResultExample", //redirects to ControllerExample/Edit/idVar1/Brands?idVar2=idVar2 instead of ControllerExample/Edit/idVar1/Brands/idVar2 
      new {idVar1= idVar1, idVar2 = idVar2 }); 
    } 

답변

3

당신은 1 개 노선과 1 개 액션 메소드와 함께이 작업을 수행 할 수 있습니다 : 여기

, 우리는을 사용하여 여기에

은 예제 코드? 마지막 URL 매개 변수가 선택적임을 나타내며 기본 메소드 인수를 사용하여 작업 메소드에서 동일한 작업을 수행합니다.

[Route("ControllerExample/Edit/{idVar1}/Brands/{idVar2?}")] 
public ActionResult ActionResultExample(int idVar1, int? idVar2 = null) 
{ 
    var idVar2Int = !idVar2.HasValue ? getDefaultVar2() : idVar2.Value; 
    var objectForView= ObjectController.Get(idVar1, idVar2Int); 

    return View("ActionResultExample", objectForView); 
} 

당신이 정말로이 별도의 조치 방법으로이 문제를 가지고 싶다면, 당신은 (nuget를 통해 수행 할 수 있습니다) System.Web.Mvc 5.1로 업그레이드해야 할 수 있습니다. 그런 다음 RouteAttribute에서 Order 매개 변수를 사용할 수 있습니다. 그러나, 당신은 또한 rename at least one of the action methods because in MVC, you should not have 2 GET overloads with the same name해야 :

[Route("ControllerExample/Edit/{idVar1}/Brands/{idVar2}", Order = 1)] 
public ActionResult ActionResultExample(int idVar1, int idVar2) 
{ 
    var objectForView= ObjectController.Get(idVar1, idVar2); 

    return View("ActionResultExample", objectForView); 
} 

[Route("ControllerExample/Edit/{idVar1}/Brands", Order = 2)] 
public ActionResult ActionResultExampleWithoutDefaults(int idVar1) 
{ 
    ... 
    var idVar2 = getDefaultVar2(); 
    return RedirectToAction("ActionResultExample", //redirects to ControllerExample/Edit/idVar1/Brands?idVar2=idVar2 instead of ControllerExample/Edit/idVar1/Brands/idVar2 
     new {idVar1= idVar1, idVar2 = idVar2 }); 
} 
+0

이미 첫 번째 솔루션을 사용했습니다. 나는 단지 그것을 두 가지 다른 행동으로 구분하여 더 명확하게 보이기를 원했습니다. 가장 완벽한 답변을 원합니다. 감사! –

+0

두 번째 작업의 이름을 'ActionResultExample' 이외의 것으로 변경하면 작동합니까? 기술적으로, 귀하의 오버로드 MVC 컨트롤러에 대한 불법입니다 (내 대답은 링크 참조) – danludwig

0

나는 아직 RouteAttribute 사용하지 않은,하지만이 주문 문제처럼 보인다.

확인 http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#order

에서 라우팅을하는 오래된 방법입니다. \ App_Start \ RouteConfig.cs 당신이 당신의 경로 올바른 방법을 주문했다. 그리고 다른 모든 것이 실패하면 마지막 경로가 사용되었습니다.

그래서 RouteAttribute를 사용하려면 경로 순서를 설정해야합니다. 아마 RouteAttribute를 사용하는 것이 가능할 수도 있습니다. 그렇지 않다면 일을하는 옛 방식으로 대체해야합니다.

0

ASP.NET MVC는 idVar1 및 idVar2가있는 route로 이동할지 여부를 routevalues로 지정하거나 idVar2를 쿼리 문자열 값으로 사용하지 않으므로 모든 매개 변수에 동일한 이름을 사용할 수 없습니다. 예상대로

[Route("ControllerExample/Edit/{idVar3}/Brands")] 
    public ActionResult ActionResultExample(int idVar3) 
    { 
     var idVar2 = 100; 
     return RedirectToAction("ActionResultExample", 
      new { idVar1 = idVar3, idVar2 = idVar2 }); 
    } 

이 작동합니다 : 다른 경로 값 이름을 사용하는 두 번째 방법에 코드를 변경 .

그러나 idVar2에 기본값을 제공하는 경우에만 2 가지 방법을 사용하는 경우에는 필요하지 않습니다. 당신은 할 수 있습니다 :

[Route("ControllerExample/Edit/{idVar1}/Brands/{idVar2=100}")] 

은 100 의 디폴트 값을 설정 또는 컨트롤러에서 nullable 형식을 사용하려면 : routevalue 이름이 경로 속성에서 물음표로 끝나는

[Route("ControllerExample/Edit/{idVar1}/Brands/{idVar2?}")] 
public ActionResult ActionResultExample(int idVar1, int? idVar2) 

주 설정은 선택적 매개 변수입니다.