2017-02-10 11 views
0

내가 한 행동이 있고, foo의 값에 따라 내가 특정 작업에 재 지정하려는하십시오 JsonResult을 반환하지 않습니다 RedirectToAction 때문에,다른 JsonResult 액션에 대한 MVC 암시 적 리디렉션이 가능합니까?

public JsonResult FirstAction(string foo) // foo == "SecondAction" 
{ 
    return RedirectToAction(foo); 
} 

public JsonResult SecondAction() { } 

이 작동하지 않습니다 및 방법의이 없다 나는 (내가 아는 한) 변환한다.

호출 할 메소드를 결정하기 위해 여기에 switch의 조건을 사용할 수 있지만 가능하면 암시 적으로 유지하고 싶습니다.

+1

반환 형식을'JsonResult'에서'ActionResult'로 변경하십시오. 여기에서'JsonResult'와'RedirectResult'가 상속합니까? 당신은 항상 그 메소드에서 JSON을 리턴하지는 않으므로 사용중인 리턴 유형이 맞지 않습니다. – CodeCaster

+2

어, AJAX 통화를위한 작업을 만들고있는 것 같습니까? 그렇다면 "리디렉션"논리는 무엇입니까? – Kamo

+0

은'JsonResult' 대신'ActionResult'를 사용합니다. 당신은 현재 액션에서'return Json (yourData, JsonRequestBehavior.AllowGet)'을 사용하여 결과로 JSON을 반환 할 수 있습니다. 아니면'SecondAction' –

답변

0

RedirectToAction은 사용자의 브라우저가 다른 URI를 요청하도록 지시하는 Http 302로 응답합니다.

메서드의 반환 형식을 ActionResult으로 변경하기 만하면 코드가 예상대로 작동합니다.

+0

@MikeDebela 감사합니다. – Jamiec

0

올바르게 이해한다면 메서드에 전달 된 매개 변수의 값에 따라 다른 동작과 다른 논리를 실행하려고합니다.

당신이 할 수있는 한 가지 방법은 라우팅 시스템을 사용하는 것이지만, 매개 변수의 가능한 값이 관리 가능한 크기 인 경우에만 이것을 선택하는 것이 좋습니다. 당신의 RouteConfig.cs에서 다음

파일 : 논리 # 1에 의해 처리되어야한다 foo는 각각의 가능한 값이, 자책골 URL을 것

public static void RegisterRoutes(RouteCollection routes) 
{ 
    // ... other routes 

    string[] possibleValueSet1 = new[] { ... }; 
    string[] possibleValueSet2 = new[] { ... }; 

    for (int i = 0; i < possibleValueSet1.Length; ++i) 
    { 
     routes.MapRoute(
      name: "YourActionWithValueSet1_" + i.ToString(), 
      url: "ControllerName/FirstAction/" + possibleValueSet1[i], 
      defaults: new { controller = "ControllerName", action = "FirstAction", foo = possibleValueSet1[i] } 
     ); 
    } 

    for (int i = 0; i < possibleValueSet2.Length; ++i) 
    { 
     routes.MapRoute(
      name: "YourActionWithValueSet2_" + i.ToString(), 
      url: "ControllerName/SecondAction/" + possibleValueSet2[i], 
      defaults: new { controller = "ControllerName", action = "SecondAction", foo = possibleValueSet2[i] } 
     ); 
    } 

} 

이 방법, 동일 값 적용 이는 로직 # 2에 의해 처리되어야한다.

내 생각에 당신은 이미 암시적인 반면, 단순한 의사 결정을 구현하는 것보다 더 유지 보수가 가능하거나 일반적으로 더 나은 것은 아니라고 생각합니다. C#에서 허용하지 않는 "값 기반 오버로드"와 같은 사운드를 요구하는 경우, 위의 코드는 실제 오버로드는 아니지만 라우팅 엔진에서 처리하도록하는 일종의 더러운 해결 방법입니다. 하드 코드 된 가능한 값을 기반으로 다른 조치에 맵핑합니다.

+0

고마워요,하지만 OP에 명시된대로 이것을 피하는 것이 이상적입니다. 메서드를 호출하는 암시 적 싶습니다 및 MVC 경로를 사용하여 반사 또는 일부 자세한 조건보다는 내 최선의 옵션을 보인다. 당신 말이 맞습니다. 이것은 훌륭한 접근 방법입니다. –

+0

당신의 뜻을 짐작하기 위해 "어떻게"에 대해 말하지 말고 변경 내용을 설명해주십시오. 또한이 질문은 당신이 변경하지 않은 반환 유형에 대한 것입니다. – CodeCaster

+0

솔직히 말해서 왜 리다이렉트 (리다이렉트가 클라이언트의 원인이되는지)를하는 것이 간단한 결정 로직을 구현하는 것보다 낫다. –

0

RedirectToAction을하는 대신 SecondAction 자체를 반환해야합니다.

public JsonResult FirstAction(string foo) // foo == "SecondAction" 
{ 
    return SecondAction(); 
} 

public JsonResult SecondAction() { } 
+0

downvoting하는 이유를 용의가 있습니다. –

0

위에서 설명한 경로 기반 접근 방식 외에도 ActionMethodSelectorAttribute 속성을 살펴보아야합니다. 이것은 HttpPostHttpGet 등의 기반이되는 속성으로, 부울 값을 반환하여 작업의 유효성을 제어 할 수 있습니다.

public abstract bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo); 

그런 다음이 같은 구현할 수 있습니다 : 이것은 당신이 재정의해야하는 방법입니다 컨트롤러에서 다음

public class ValidBasedOnFoo 
{ 
    public int MethodNum { get; set; } 

    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) 
    { 
     var foo = controllerContext.HttpContext.Request["foo"] as string; 

     if (MethodNum == 1) 
      return YourDecisionLogicForFirstAction(foo); 
     else if (MethodNum == 2) 
      return YourDecisionLogicForSecondAction(foo); 
     else throw new InvalidOperationException("Unknown method number."); 
    } 
} 

을, 행동은 같습니다

[ValidBasedOnFoo(1)] 
public JsonResult FirstAction(string foo) { ... } 

[ValidBasedOnFoo(2)] 
public JsonResult SecondAction(string foo) { ... } 

그리고 이것은 값이 조치에 대해 적절한 경우 조치가 실행되도록합니다.속성에 사용 된 숫자는 사용할 의사 결정 로직을 알려주는 것이고, 더 명확한 경우 각 액션에 대해 하나의 속성을 구현할 수 있습니다.