2012-02-22 15 views
4

ファイルのリストを表示していて、ユーザーがリストから削除できるようにしています。削除ボタンは、コントローラーへのajax呼び出しを実行して「削除」アクションを実行します。ただし、削除アクションは呼び出されません.AjaxOptionsで定義された確認アラートが表示されます。それが価値あるものであれば、WebFormsエンジンを使用して作業し、それをRazorに移動しただけです。また、私がAreaを使ったのは初めてです。削除アクションを直接呼び出すと動作します。これはルーティングの問題ですか?Ajax.ActionLinkがコントローラ・アクションを呼び出さない

ここ

public EmptyResult Delete(string fileName) 
    { 
     if (fileName.IsNullOrEmpty()) return null; 
     var model = new Models.BenefitBookletModel(); 
     model.DeleteBooklet(fileName); 
     return null; 
    } 

の背後にあるコードはここ。ここ

@Ajax.ActionLink("test", "Delete", new { fileName = item.FileName }, new AjaxOptions 
                       { 
Confirm = "Are you sure you want to delete " + item.FileName + "?", 
OnComplete = "function(){deleteComplete('" + item.jsReferenceableFileName + "')}", 
HttpMethod = "DELETE", 
OnFailure = "function(){alert('Could not delete file');}" 
       }, new { @class = "DeleteButton" } 
                      ) 

アップマークが私のRegisterRoutesエリア登録

context.MapRoute("Marketing_default","Marketing/{controller}/{action}/{id}",new { action = "Index", id = UrlParameter.Optional } 
から

 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.MapRoute("SubscriberAll","subscriber/{id}",new { controller = "Subscriber", action = "ShowAll" },new { id = @"\d+" }); 
     routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 

ルートでいますここで

削除するアクションリンクのHTTPMETHODを定義しているが、あなたの方法は、おそらく唯一のGET受け付け

<a href="/Marketing/BenefitBooklet/Delete?fileName=MyFileName.pdf" data-ajax-method="GET" data-ajax-failure="function(){alert('Could not delete file');}" data-ajax-confirm="Are you sure you want to delete MyFileName.pdf?" data-ajax-complete="function(){deleteComplete('MyFileName.pdf')}" data-ajax="true" class="DeleteButton"> </a> 
+0

あなたがルートを登録Global.asaxのからの情報を追加してください。 – Kath

+0

Deleteメソッドはビューをレンダリングしたものと同じコントローラ内にありますか?そうでなければ、ActionLink(AjaxHelper、String、String、String、Object、AjaxOptions)オーバーロードを使用してコントローラを定義する必要があります。 –

+0

はい、両方とも同じコントローラにあります。 –

答えて

4

対応するAjaxOptionsプロパティの値として関数名を指定する必要があります。あなたのビューで

<script type="text/javascript"> 
    function OnFailure(request, error) { 
     alert('Could not delete file'); 
    } 
    function OnComplete(request, error) { 
     alert('Delete complete'); 
    } 
</script> 

と 'AjaxOptions' にOnFailureOnCompleteを変更します:scriptセクションを追加します

OnFailure = "OnFailure" 
OnComplete= "OnComplete" 
+0

それが問題でした。関数()が問題を引き起こしていました。ありがとう! –

1

を生成するマークアップです。 Deleteアクション動詞でそれを飾ってみてください。

[HttpDelete] 
public EmptyResult Delete(string fileName) 
+0

試したHttpDeleteと[AcceptVerbs(HttpVerbs.Delete)]。コントローラーのアクションはAjaxから呼び出されません.ActionLink –

+0

HTTPの削除を実行するアクションへのリンクを作成できないため、動作しません。予想通りの '偽の削除 '要求になりますあなたはそのリンクをクリックする404を取得する。 – WarHog

+0

ページにJSエラーがありますか?あなたはすべてのjsファイルを持っていますか? jquery.unobtrusive-ajax.min.jsを含みます。 '[HttpPost]'と 'HttpMethod =" POST "'に変更してみることもできます。 –

関連する問題