2016-07-19 6 views
1

を作成しかし、私はsettingProfile JSオブジェクトに包まれたデータを送信するためにAJAXを使用しようとするんそれはHTTP 500内部サーバーエラーエラーを返します、私は問題がデータ型にあると考えています。 AJAXでCreateメソッドを呼び出す正しい方法は何ですか?どのように私は(SettingProfile /作成行くことによって)定期</p> <p>をモデルを作成するために、ASP.NET MVCでAJAXを使用してモデル現在、私ができる5

マイコード:

モデル:

public class SettingProfile 
    { 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public long? UserId { get; set; } 
     public string Url { get; set; } 
    } 

ビュー(JS):

function saveSettingProfile() { 
     var name = prompt("Please enter profile name", ""); 
     var url = $("form").serialize(); // Not AJAX url, its a variable in model 

     var settingProfile = { 
      Name: name, 
      Url: url 
     }; 

     jQuery.ajax({ 
      url: "@Url.Action("Create", "SettingProfile")", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      method: "POST", 
      data: settingProfile 
     }).done(function (response) { 
      alert("Profile saved successfully"); 
     }).fail(function() { 
      alert("Could not save profile"); 
     }); 
    } 

コントローラー:

 [HttpPost] 
     //[ValidateAntiForgeryToken] 
     public ActionResult Create([Bind(Include = "Name,Url")] SettingProfile settingProfile) 
     { 
      settingProfile.UserId = 8; // TODO: get user id from session 
      if (ModelState.IsValid) 
      { 
       db.SettingProfiles.Add(settingProfile); 
       db.SaveChanges(); 
       return Json(new { success = true }); 
      } 
      return Json(new { success = false }); 
     } 
+1

HTTPステータスが500の場合、例外メッセージは何ですか? – Anton

+0

Ajax.BeginFormメソッドを使用できないのはなぜですか? – Xavr

答えて

1

500エラー手段、サーバーコードがクラッシュします。それは多くの理由の可能性があります。私が気付いたこと(500エラーが発生する可能性があります)は、データを送信する方法です。

contentTypeを "application/json"と指定しましたが、そのままjavascriptオブジェクトを送信しています。したがって、あなたのリクエストペイロードは次のように送信されます

Name=SomeNameValue&Url=SomeUrlValue現在のサーバーコードでは、モデルバインダーはSettingProfileのオブジェクトにマップできません。

解決方法は、javascriptオブジェクトの文字列化されたバージョンを送信することです。これを行うにはJSON.stringifyメソッドを使用することができます。

jQuery.ajax({ 
       url: "@Url.Action("Create", "SettingProfile")", 
       contentType: "application/json; charset=utf-8", 
       method: "POST", 
       data: JSON.stringify(settingProfile) 
     }).done(function (response) { 
      alert("Profile saved successfully"); 
     }; 

今すぐあなたのクライアントコードは、それを適切にマッピングすることができるようになります

{"Name":"SomeName","Url":"SomeUrl"} 

とモデルバインダーのような要求ペイロードを送信します。

単純なデータの場合は、カスタムのcontentTypeを指定せずにjsオブジェクトをそのまま送信することができます。 jQueryは "application/x-www-form-urlencoded"というデフォルトのcontentType値を使用し、モデルバインディングが機能します。

したがって、以下のコードは正常に動作します。

jQuery.ajax({ 
       url: "@Url.Action("Create", "SettingProfile")", 
       method: "POST", 
       data:settingProfile 
     }) 

また、ブラウザのネットワークタブを確認して、そのajax呼び出しでサーバーから返される応答を確認することもできます。例外が発生した場合、そこに詳細が表示されます。

+1

ありがとう、それは動作します! – Yustx

+0

@Yustx私は最初に承認しました(私は注意深く読んでいなければなりません)、あなたの編集をロールバックしました。 'JSON.stringify'は必要ありません。私がしようとしていた全体のポイントは、コードはそれなしで動作します。 – Shyju

関連する問題