2016-08-12 4 views
0

Ajax를 통해 MVC 작업을 호출하는 데 실패했습니다. 내가 이렇게하면 다음과 같은 오류가 발생합니다ASP.NET MVC에서 AJAX를 통해 POST 작업 메서드를 올바르게 호출하는 방법

HttpException: A public action method 'Find' was not found on controller 'MyProject.Controllers.LoanController'. 

내가 호출을 시도하고있어 액션 메소드의 서명을 다음

[Route("Loan/Find/{loanNumber:int}")] 
[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)] 
[ActionName("Find")] 
[AllowAnonymous] 
public ActionResult Find(int loanNumber) 
{ 
    var model = new LoanStatusModel 
    { 
     Record = Repository.GetRecord(loanNumber), 
     User = this.SecurityPrincipal 
    }; 

    return this.PartialView("LoanStatusSearchResult", model); 
} 

다음대로 호출을 시도 뷰 코드 :

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapMvcAttributeRoutes(); 

    routes.MapRoute(
     "Default", 
     "{controller}/{action}/{id}", 
     new 
      { 
       controller = "Home", 
       action = "Index", 
       id = UrlParameter.Optional 
      } 
     ); 

} 
:
@using(Ajax.BeginForm("Find", new AjaxOptions 
             { 
              HttpMethod = "POST", 
              AllowCache = false, 
              InsertionMode = InsertionMode.Replace, 
              UpdateTargetId = "ajaxTarget", 
              LoadingElementId="loader" 

             })) 
{ 
    <fieldset> 
      <div class="col-sm-3"> 
       <input type="text" 
         id="loanNumber" 
         name="loanNumber" 
         value="@Model.LoanNumber" 
         class="form-control" 
         minlength="8" 
         maxlength="10"/> 
      </div> 
      <div class="col-sm-7"> 
       <input type="submit" 
         value="Search" 
         class="btn btn-primary"/> 
      </div> 
     </div> 
    </fieldset> 
} 

<div id="loader" style="display:none"> 
    Working, please wait... 
</div> 
<div id="ajaxTarget"> 
</div> 

내 RouteConfig.cs의 내용입니다3210

Fidler는 루트에 대한 요청으로 HTTP 401 Not Authorized가 발생한다고보고합니다. 원래 익명 액세스를 사용하지 않도록 설정된 인트라넷 사이트이므로이 종류가 적합합니다. 그러나 익명 액세스를 사용할 수 있으며 오류가 계속 발생합니다.

  • 나는 익명 요청을 허용하도록 IIS를 변경하고 서버를 다시 시작 :

    이 문제를 해결하려면, 나는 모든 인터넷 (특히에 StackOverflow)을 통해 검색 한 후 다음과 같은 노력했다. 이것은 결과에 아무런 영향을 미치지 않았습니다.
  • 원래 동작 방법은 HttpPostAttribute으로 장식되었습니다. AcceptVerbs을 사용하도록 변경하면 결과에 아무런 영향을 미치지 않습니다.
  • 나는이 방법에 AllowAnonymous을 추가했으며 결과에 아무런 영향을 미치지 않았습니다.

어떻게이 문제를 해결할 수 있습니까? 해결할 수 있습니까? 어떤 다른 정보를 제공해야합니까?

답변

2

당신은 당신이 yourSite/Loan/Find/123123313와 액션 메소드에 액세스 할 때 그래서 액션 메소드로 이동합니다 속성 경로 정의를

[Route("Loan/Find/{loanNumber:int}")] 

을 가지고 있지만, 당신은 정상 yourSite/Loan/Find?loanNumber=123123123를하려고하면, 그것은 작동하지 않습니다!

귀하의 Ajax.BeginForm HTML 도우미로 form 태그의 액션 값을 생성 "/ 홈/찾기 '와 양식을 제출할 때, loanNumber의 값은 게시물 본문에 제출 될 것입니다. 그것은 당신이에 정의 된 경로 패턴에없는 속성 라우팅 정의

속성 라우팅 경로 정의를 제거하면 코드가 작동합니다. 속성 라우팅은 주로 친숙한 친절한 URL을 생성하는 데 사용되므로 양식 게시 시나리오가 아닌 GET 작업에 가장 적합합니다.

속성 라우팅 경로 패턴을 유지하려는 경우 Ajax.BeginForm 도우미 메서드를 사용하지 말고 aja를 처리하는 것이 좋습니다. x 당신이 당신이 원하는 방식으로 URL을 구축 할 수있는 곳으로 전화하십시오.

그래서 일반 양식을 작성하고 양식에 ID를 지정하십시오.

@using (Html.BeginForm("Find","Home", FormMethod.Post,new {id="mySearchForm"})) 
{ 
    <div class="col-sm-3"> 
     <input type="text" id="loanNumber" name="loanNumber"value="@Model.LoanNumber" /> 
    </div> 
    <div class="col-sm-7"> 
     <input type="submit" value="Search" /> 
    </div> 
} 

하고는이 양식에 이벤트를 제출 듣고 자바 스크립트가 기본 동작을 중지하고 우리가 원하는 URL로 아약스 전화를 걸!

$(function() { 

    $("#mySearchForm").submit(function(e) { 
      e.preventDefault(); 
      var url = "@Url.Action("Find","Home")"; //change to your controller name  
      url = url + "/" + $("#loanNumber").val(); 
      $.post(url, function(res) { 
        $("#ajaxTarget").html(res); 
      }); 
    }); 

}); 
+0

OH. 나의. 하나님. 나는 그것을 놓쳤다는 것을 믿을 수 없다. (epicfacepalm) 내가 간과 한 횟수를 믿지 않을 것이다. 생명의 은인, 친구. –

+0

커스텀 아약스 솔루션으로 답변을 업데이트했습니다. 환호 :) – Shyju

+0

나는 실제로 길을 고쳤다./Loan/Status가되고 본문에 양식 데이터가 전달되기를 원합니다. 올드 스쿨 URL은 여기 주위에 없습니다. –

관련 문제