2017-08-10 24 views
0

私の意図は、ユーザーがデータを送信したときに現在のページを完全に再読み込みせずに、成功または失敗などのメッセージボックスをポップするだけで、データベースを更新することです。ASP MVC 6 AJAX Bad Request

ユーザーがボタンをクリックしたときに呼び出される以下のJS関数があります。

function saveListItem(formID) 
{ 
    alert('JS function fired.'); 
    var _form = $('#mainForm' + formID) 
    var _formData = _form.serialize(); 

    $.ajax({ 
     dataType: "json", 
     type: "POST", 
     url: "/Postings/listItemSubmitted", 
     contentType: "application/json; charset=utf-8", 
     data: { type: "test" }, 
     success: function() { 
      alert("success"); 
     }, 
     error: function (xhr, status, error) 
     { 
      alert(error.toString()); 
     } 
    }); 
} 

そしてここでは、コントローラのアクションです:

[HttpPost] 
[ValidateAntiForgeryToken] 
public JsonResult listItemSubmitted([FromBody] string type) 
{ 
    type += "!!!"; 
    return Json(type); 
} 

あなたが見ることができるように、私は私が後で実際に何かをするために使用するいくつかの変数を持っています。しかし、今のところ、私はちょうどこのテストが動作するように取得しようとしています。問題はコントローラの動作が起動しないことです。エラーアラートで「Bad Request」が表示されます。

すべての名前が正しいことを確認しました(コントローラはPostingsController.cs、メソッド名はlistItemSubmitted)。私は、URL構文内の単語の前後にスラッシュのすべての組み合わせを試してみました。私も、とにかく私にその文字列を与えたの@ Url.Action方法を、使用して試してみたので、私はそれが正しいことを知っています。

私は他に何を試すべきか分かりません。誰が何が起こっているか知っていますか?

+0

URL: "http:// host/Postings/listItemSubmitted"、 – volkinc

+2

[ValidateAntiForgeryToken]属性を削除してみてください。あなたの投稿でトークンを送信していないので、要求が機能しなくなります。 –

答えて

0

コントローラーでフィルタとして使用したValidateAntiForgeryTokenに問題があると思います。あなたは、サーバーへのデータとともに、関連する入力値を送信する必要があります。このフィルタを削除してみてください。

+0

OPが '@ Html.AntiForgeryToken()'をビューに含めると、 'var _formData = _form.serialize();'にトークンが含まれます –

+0

@StephenMuecke OPがシリアル化されたフォームデータをサーバーが、ここでは、彼らはそれをしなかったので、私はフィルタを削除することが提案しました。 –

+0

はい、それらは持っています - それは 'var _formData = _form.serialize();'です: –