2016-08-12 67 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); 
} 

試圖調用它是如下視圖代碼:

@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的內容:

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 
      } 
     ); 

} 

Fidler報告,對路由的請求導致HTTP 401未授權,這種情況有意義,因爲這是最初配置爲禁用匿名訪問的Intranet站點。但是,匿名訪問已啓用,並且錯誤仍然存​​在。

要解決這個問題,我已經嘗試了所有通過互聯網(StackOverflow的特別)搜索後執行以下操作:

  • 我改變了IIS接受匿名請求,並重新啓動服務器。這對結果沒有影響。
  • 最初,行動方法是用HttpPostAttribute裝飾的。將其改爲使用AcceptVerbs對結果沒有影響。
  • 我在該方法中加入了AllowAnonymous,它對結果沒有影響。

如何解決此問題?它可以解決嗎?我還需要提供哪些其他信息?

回答

2

你有一個屬性路線定義

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

所以,當你嘗試用yourSite/Loan/Find/123123313訪問您的操作方法將到操作方法,但如果你嘗試正常yourSite/Loan/Find?loanNumber=123123123,這是行不通的!

您的Ajax.BeginForm html幫助程序生成表單標籤的操作值爲「/ Home/Find」,當您提交表單時,loanNumber的值將在郵件正文中提交,它不在您定義的路由模式中屬性路由定義

如果你刪除了屬性路由路由定義,你的代碼將會工作。屬性路由主要用於創建漂亮的seo友好類url。所以它最好用於GET操作,而不是表單發佈場景。

如果你仍然想保留屬性路由路由模式,我建議你不要使用幫助者方法Ajax.BeginForm並處理aja x打電話給你的自己,你可以按照你想要的方式構建url。

因此,建立一個正常的形式,給一個身份證的形式。

@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> 
} 

,並有JavaScript來聽這個表單的提交事件,阻止默認行爲,並與我們想要的網址Ajax調用!

$(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。 MY。神。我不能相信我錯過了這一點。 (/ epicfacepalm)你不會相信我忽略了多少次。救命恩人,老兄。 –

+0

我用自定義ajax解決方案更新了答案。乾杯:) – Shyju

+0

我實際上修好了路線。我們希望它成爲/貸款/狀態並在表格中傳遞數據。老派的網址在這裏是個不錯的選擇。 –

相關問題