2016-10-06 11 views
0

インデックスのWebページに配置されたボタンでレコードを削除したいと思います。私はAJAXでjQueryを書きましたが、うまくいきません。データベースからレコードを削除するスクリプトが機能しません

ここに私のコントローラの方法です。このメソッドは、HttpGetのDeleteメソッドによって別のページで生成されたフォームを使用して呼び出すと正しく動作します。

[HttpPost] 
[ActionName("Delete")] 
[ValidateAntiForgeryToken] 
public IActionResult DeleteConfirmed(int id) 
{ 
    var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier); 
    var training = _context.Trainings.Where(t => t.UserId == userId).FirstOrDefault(t => t.Id == id); 
    if (training != null && ModelState.IsValid) 
    { 
     _context.Trainings.Remove(training); 
     _context.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View();    
} 
$(document).ready(function() { 
    $(".js-delete").on("click", function() { 
     var button = $(this); 
     var trainingId = button.attr; 
     if (confirm("Are you sure you want to delete this training?")) { 
      $.ajax({ 
       url: "/Training/Delete/" + trainingId, 
       type: "POST", 
       contentType: "application/json", 
       success: function() { 
        alert("ok"); 
       }, 
       error: function(){ 
        alert("not ok");       
      } 
      }); 
     } 
    }); 
}); 
<button data-customer-id="@training.Id" class="btn btn-link js-delete">Usuń</button> 

私が今抱えていることである:ウィンドウのポップアップと私が確認した後、私は私のスクリプトによって生成されたエラーの結果を取得し、コンソールに、私は状況を持っている:400、タイプ:XHRを応答は次のとおりです。

http://localhost:6822/Training/Delete/function%20(%20name,%20value%20)%20%7Breturn%20access(%20this,%20jQuery.attr,%20name,%20value,%20arguments.length%20%3E%201%20);%7D 
+1

あなたのAJAX呼び出しとAjaxの呼び出しを行うことは、 'RedirectToAction(「インデックス」)を返すようにリダイレクトすることはできません;'意味がありません。メソッドにはモデルのパラメータがないので、 'ModelState.IsValid'は意味を持ちません(常に有効です)。 'data-customer-id'の値を設定するには' var trainingId = $(this)).data( 'customer-id'); 'で、ajaxは 'url:"/Training/Delete/"にする必要があります。 、data:{id:trainingId}、 '' contentType: "application/json"、 ' –

+0

'を削除してください。ここでJSON形式を使用していないので、contentType: "application/json" 必要に応じて、 'dataType:" text "'と 'data:{id:trainingId}'と 'url:"/Training/Delete/"' – GauravKP

+0

@StephenMueckeを追加してください。私はあなたのヒントに従ってコードを書いた。 ルーティングの問題があると思います(トレーニング/削除/を呼び出すので、 のようになります)。 routes.MapRoute( name: "default"、 テンプレート: "{controller =idはオプションで、MVC5のようなデフォルトプロパティで設定する方法を見つけましたが、問題はUrlParameter.Optionalが機能しないことです。 ルーティングを再設定するか、関数を別に書くべきですか? – tzu314

答えて

0
http://localhost:6822/Training/Delete/function%20(%20name,%20value%20)%20%7Breturn%20access(%20this,%20jQuery.attr,%20name,%20value,%20arguments.length%20%3E%201%20);%7D 

私は、URLのようなものであるべきだと思う:

http://localhost:6822/Training/Delete/5 (since your action expects int value in parameter.) 

あなたのスクリプトをデバッグし、trainingIdで何を取得しているかを確認する必要があります。

 var button = $(this); 
     var trainingId = button.attr; 

ここでは、パラメータの下に関数を渡しているためです。 関数%20(%20name、%20value%20)%20%7Breturn%20access(%20、%20jQuery.attr、%20name、%20value、%20arguments.length%20%3E%201%20);%7D

私はあなたが試してみてくださいと思う:

var trainingId = $(this).attr("data-customer-id") 
関連する問題