2016-08-07 6 views
2

Ich habe diese Form:Ajax Beitrag: ASP.NET MVC Aktion empfängt leeres Objekt

@model CupCakeUI.Models.CupCakeEditViewModel 
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "createFrm" })) 
{ 
    <div class="form-group"> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.Name) 
     </div> 
     <div class="editor-field"> 
      <input type="text" id="Name" name="Name" value="@Model.Name" /> 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model) 
     </div> 
     <div class="editor-field"> 
      <input type="text" id="Price" name="Price" value="@Model.Price" /> 
     </div> 
     <div class="col-md-offset-2 col-md-10"> 
      <input type="button" id="btnCreate" value="Create" class="btn btn-default" /> 
     </div> 
    </div> 
} 

ich Ajax Post zu verwenden, ich versuche, Daten an die Aktion Methode zu senden, aber es ist immer leeres Objekt zu empfangen. Ich habe das mehrmals in der Vergangenheit getan, und jetzt habe ich versucht, verschiedene Arten, die nicht funktionieren, ist der Code:

$(document).ready(function() { 
    $("#btnCreate").click(function() { 
     var name = $("#Name").val(); 
     var price = $("#Price").val(); 
     var cupCakeEditModel = { "CupCakeId": 0, "Name": name, "Price": price }; 
     var json = JSON.stringify(cupCakeEditModel); 
     $.ajax({ 
      type: 'POST', 
      url: "/CupCake/Create", 
      data: JSON.stringify(cupCakeEditModel), 
      contentType: 'application/json', 
      success: function() { 
       alert("succes"); 
      }, 
      error: function() { 
       alert("error"); 
      } 
     }); 
    }) 
}) 

Sein dies in der Konsole zeigt bei der Anmeldung: enter image description here

Dies ist die Aktion Methode und Klasse verwendet:

[HttpPost] 
public JsonResult Create (CupCakeUI.Models.CupCakeEditViewModel cupCakeEditModel) 
{ 
    var cupCake = 
    CupCakeData.Save(cupCakeEditModel); 
    return Json("cupCake", 
    JsonRequestBehavior.AllowGet); 
} 

Dies ist die Klasse:

public class CupCakeEditViewModel 
{ 
    public int CupCakeId; 
    [Display(Name = "CupCake Name")] 
    public string Name; 
    public string Price; 
} 

Ich habe auch dieses, aber nicht funktioniert:

$("#btnCreate").click(function() { 
    var cupCakeEditModel = 
    $("#createFrm").serialize(); 
    $.ajax({ 
     url: "/CupCake/Create", 
     type: "POST", 
     data: cupCakeEditModel, 
     success: function (response) { 
      alert("Success"); 
     }, 
     error: function (response) { 
     } 
    }); 
}) 

Und einige Antworten, die ich auf dem Forum zu finden, aber es scheint seltsam etwas!

+0

Zeigen Sie Ihr Modell. (und nicht verwandt, aber Sie sollten '@ Html.TextBoxFor (m => m.Name)' etc) anstatt Sie HTML manuell zu erstellen) –

+0

Ja @StephenMuecke, ich benutzte dies, aber ich habe alles verändert, um zu machen es funktioniert, deshalb habe ich alles verändert. – Coding

+0

Ich habe das Klassenmodell im Code-Snippet mit der Aktionsmethode – Coding

Antwort

3

Ihr Modell enthält nur Felder und DefaultModelBinder bindet keine Felder, nur Eigenschaften. Ändern Sie das Modell in

public class CupCakeEditViewModel 
{ 
    public int CupCakeId { get; set; } 
    [Display(Name = "CupCake Name")] 
    public string Name { get; set; } 
    public string Price { get; set; } 
} 
+0

eingefügt. Wow! Das habe ich vermisst. Ich habe es nie gesehen. – Coding

+1

Als Nebenbemerkung ist Ihre zweite Option (mit '.serialize()' besser und weniger Code) und Sie sollten wirklich 'url: '@ Url.Action (" Create "," CupCake ") verwenden, um sicherzustellen, dass URL wird immer korrekt generiert. –

+0

Ja, natürlich. Danke trotzdem. – Coding