2017-10-28 16 views
0

私は、Webアプリケーション、ASP.Net MVC 4.0 with entityframework 6.0で、ユーザー選択ごとにデータベースを更新しようとしています。データは、jQuery AJAXを使用してコントローラのアクションに送信されます。以下は、データベースを更新するエンティティを更新するC#コードです。jQuery AJAXは常にエラーが発生しています:{}

public void modidyProduct(Productdetail prodData) 
{ 
    try 
    { 
     using (SampleTrialEntities entity = new SampleTrialEntities()) 
     { 
      var data = entity.Productdetails.Where(p=>p.ProductID == prodData.ProductID).FirstOrDefault<Productdetail>(); 
      data.ProductName = prodData.ProductName; 
      data.ProductNumber = prodData.ProductNumber; 
      data.CategoryName = prodData.CategoryName; 
      data.ModelName = prodData.ModelName; 
      entity.Entry(data).State = System.Data.Entity.EntityState.Modified; 
      entity.SaveChanges(); 
     } 
    } 
    catch (Exception) 
    {} 
} 

jQuery AJAXがそのコントローラアクションメソッドを呼び出します。

function updateProduct() { 
     var productData = { 
      ProductName: $('#prodName').val().trim(), 
      ProductNumber: $('#prodNum').val().trim(), 
      CategoryName: $('#ctgryName :selected').text(), 
      ModelName: $('#mdlName :selected').text(), 
      ProductID: atob($('#editProductId').val()) 
     }; 
     debugger; 
     $('#divLoader').show(); 
     $.ajax({ 
      url: '@Url.Action("modidyProduct", "Home")', 
      data: JSON.stringify(productData), 
      type: 'POST', 
      dataType: 'json', 
      contentType: 'application/json;charset=utf-8', 
      success: function (jqXHR) { 
       //Below line will destroy DataTable - tblProducts. So that we could bind table again. next line - loadData(); 
       $('#tblProducts').DataTable().destroy(); 
       $('#divLoader').hide(); 
       loadData(); 
       $('#addModal').modal('hide'); 
       $('#editProductId').val(''); 
      }, 
      error: function (msg) { 
       debugger; 
       $('#editProductId').val(''); 
       $('#divLoader').hide(); 
       alert(msg); 
       alert("What's going wrong ?"); 
       //alert(jqXHR.responseText); 
      } 
     }); 
    } 

jQueryのAJAXの方法&コントローラのアクションを実行した後、成功したデータベースのレコードを更新します。応答ステータスコード - 200 &ステータス - OKが返されます。しかし、エラーのみ:{}、AJAXメソッドで毎回コードブロックが実行されます。 Debugging screen capture with status-OK; statuscode - 200

答えて

1

あなた$.ajaxメソッド呼び出し

dataType: 'json', 

のこの部分はAJAX呼び出しコードが戻ったが、現在有効なJSONレスポンスを期待しているサーバーのメソッドの戻り値の型がvoidである、というのjQueryを伝えます。つまり、何も返さないことを意味し、$.ajax方法は、(それが有効なJSONであると仮定し)の応答を解析しようとすると、データ型がjsonとなると、したがって、典型的な「parsererror」

を得ています応答がサーバーから受信された場合、データは厳密に解析されます。不正なJSONが拒否され、解析エラーがスローされます。 jQuery 1.9では、空の応答も拒否されます。

解決策は、単にコールのdataTypeプロパティを削除することです。

$.ajax({ 
     url: '@Url.Action("modidyProduct", "Home")', 
     data: JSON.stringify(productData), 
     type: 'POST', 
     contentType: 'application/json;charset=utf-8' 
    }).done(function() { 
     console.log('Success'); 
    }) 
    .fail(function(e, s, t) { 
     console.log('Failed'); 
    }); 

それともあなたはJSONレスポンスを返すために、サーバーのアクションメソッドを更新することができます。クライアント側のコードで今すぐ

[HttpPost] 
public ActionResult ModidyProduct(Productdetail prodData) 
{ 
    try 
    { 
     //to do : Save 
    } 
    catch (Exception ex) 
    { 
     //to do : Log the exception 
     return Json(new { status = "error", message=ex.Message }); 
    } 
    return Json(new { status="success"}); 
} 

、あなたは取引があなたが必ずしもdataTypeプロパティ値を指定する必要はありません

$.ajax({ 
     url: '@Url.Action("ModidyProduct", "Home")', 
     data: JSON.stringify(productData), 
     type: 'POST', 
     contentType: 'application/json;charset=utf-8', 
     dataType: 'json', 
}).done(function (res) { 
    if (res.status === 'success') { 
     alert('success'); 
    } else { 
     alert(res.message); 
    } 
     console.log('Success'); 
}).fail(function(e, s, t) { 
     console.log('Failed'); 
}); 

成功したかどうかを確認するためにJSONレスポンスを確認することができます。何も指定されていない場合、jQueryは戻ってくる応答のMIMEタイプに基づいてそれを推測しようとします。この場合、応答コンテンツのタイプはapplication/json; charset=utf-8になります。だから、あなたはすばらしいはずです。

+0

@Shyjuさん、ありがとうございます。この詳細な説明は、私のような初心者には本当に役立ちます。あなたのコメントから、私はそれを推測しました - contentType: 'application/json; charset = utf-8'は、リクエストとして 'json'の形式でパラメータを受け取ることをサーバに知らせるために使用されます。 dataType: 'json'は' json'データをレスポンスとして解析するブラウザを用意します。 @Shyju - これを正式に要約するとコメント。 –

+0

はい。サーバーはcontent Typeヘッダーを使用し、jqueryはdataTypeを使用して応答を処理します – Shyju

関連する問題