2012-02-23 3 views
1

컨트롤러에 동일한 이름을 가진 두 가지 동작이 있지만 일부 매개 변수를 허용하는 컨트롤러가 있습니다. 모호성을 제거하기 위해 GET 요청 만 허용하고 다른 요청은 POST 요청 만 허용합니다. 또한 액션 메소드에서 Ajax 호출 만 시행하는 데 사용되는 HttpAjaxAttribute가 있습니다. 어떤 이유로이 솔루션은 신뢰할 수 없습니다. 가끔 가져 오기 작업에 대한 GET 요청에서 MVC는 POST/AJAX를 고집하려고 시도하고 HttpAjaxAttribute에서 Ajax 예외를 throw합니다. 나는 a question that may be related을 발견했다. 특정 순서 (HttpGet 또는 HttpPost 및 HttpAjax)로 특성을 첨부하면 문제가 해결 될 것이라고 생각했지만 그렇지 않습니다. 내 웹 사이트가 얼마 동안 작동했지만 실패했습니다. 나는이 문제를 겉보기에 무작위로 발견했습니다. 어떻게 잘 해결할 수 있습니까?ASP.NET MVC가 잘못된 컨트롤러 동작을 선택했습니다.

컨트롤러 작업

[HttpGet] 
public ActionResult Import() 
{ 
    // some code 
} 

[HttpPost] 
[HttpAjax] 
public ActionResult Import(string country, string state, string city, ImportModel[] locations) 
{ 
    // some code 
} 

HttpAjaxAttribute

/// <summary> 
/// Makes the controller action that has this attribute applied accept only Ajax requests. 
/// </summary> 
public class HttpAjaxAttribute : ActionMethodSelectorAttribute 
{ 
    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo) 
    { 
     if (!controllerContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      throw new Exception("The action " + methodInfo.Name + " can only be called via an Ajax request"); 
     } 
     return true; 
    } 
} 
+0

시작된다 요청을 로깅. – jgauffin

+0

js 아약스 코드를 빠르게 살펴보면 도움이 될 것입니다 –

답변

3

난 당신이 HttpAjaxAttribute 에서 예외를 발생하지 않아야하지만, 단지 return false 작업이 현재 요청을 처리 할 수 ​​없을 때 확실 해요 . 그것은 바로 하나를 찾기 전에

/// <summary> 
/// Makes the controller action that has this attribute applied accept only Ajax requests. 
/// </summary> 
public class HttpAjaxAttribute : ActionMethodSelectorAttribute 
{ 
    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo) 
    { 
     return controllerContext.HttpContext.Request.IsAjaxRequest(); 
    } 
} 

MVC는 점에서 고집 아무것도, 행동의 모든 을 검사하려고합니다. 당신은 프레임 워크에게 말해야 만합니다. 현재 요청에 유효한 동작입니다. 마지막으로 MVC는 HttpGet 액션에 도달하여이를 선택합니다. 하지만 그 전에 예외를 던지면이 과정이 강제로 중지됩니다.

+0

D' oh! 이것은 웹에서 실수로 코드를 훔쳐 내도록 가르쳐 줄 것입니다. ;) 당신은 절대적으로 옳습니다, 나는 예외가 필요 없습니다. –

1

[HttpAjax] 특성을 추가하면 작업 방법 또는 전체 컨트롤러에서 수행 할 수있는 작업을 제한 할 수 있습니다.

정상적인 성능 저하가 발생하면 AJAX 요청인지 확인한 다음 부분보기를 반환하거나 JSON 또는 반환 할 항목을 확인하고 싶습니다. 그렇지 않으면 전체보기를 반환해야합니다. 이 때문에

난 당신이 속성을 HttpAjax 구현하지만,이 AjaxRequest 여부 액션 메소드에서 확인하지 않는 것이 좋습니다 :

public ActionResult Foo() 
{ 
    if(HttpContext.Request.IsAjaxRequest()) 
    { 
     // Return partial 
    } 

    // Degrade gracefully 

} 
관련 문제