2013-05-23 11 views
8

modelu Mam następujący model:wiązania z jquery ajax serialize nie działa

public class RegisterUseraccount 
{ 
    [Required] 
    [DataType(DataType.EmailAddress)] 
    [Display(Name = "E-Mail-Adresse")] 
    public string Email { get; set; } 

    [Required] 
    [Display(Name = "Vorname")] 
    public string FirstName { get; set; } 

    [Required] 
    [Display(Name = "Nachname")] 
    public string LastName { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    [MinLength(5)] 
    [Display(Name = "Passwort")] 
    public string Password { get; set; } 

    ... 
} 

i następujący pogląd:

@using (Html.BeginForm("Register", "Useraccount", FormMethod.Post, new { id = "registerUseraccountForm", @class = "ym-form" })) 
{ 
    @Html.ValidationSummary(true)   

    <div class="ym-grid"> 
     <div class="ym-g50 ym-gl"> 
      <div class="ym-fbox-text"> 
       @Html.LabelForRequired(model => model.RegisterUseraccount.FirstName, null)    
       @Html.EditorFor(model => model.RegisterUseraccount.FirstName, new { required = "required", name = "firstName" }) 
       @Html.ValidationMessageFor(model => model.RegisterUseraccount.FirstName)     
      </div> 
     </div> 
    ... 

i moją JavaScript

function sendForm(target) { 
    alert(data); 
    $.ajax({ 
     url: target, 
     type: "POST", 
     contentType: 'application/json', 
     data: $("#registerUseraccountForm").serialize(), 
     success: ajaxOnSuccess, 
     error: function (jqXHR, exception) { 
      alert('Error message.'); 
     } 
    }); 

Jest to wynikiem serializacji:

RegisterUseraccount.FirstName=Peter&RegisterUseraccount.LastName=Miller&RegisterUseraccount.Email=miller%40gmail.com&RegisterUseraccount.Password=admin 

To jest moja metoda kontroler Próbuję pocztą na adres:

[HttpPost] 
public ActionResult Register(RegisterUseraccount registerUseraccount) 
{ 
    ... 
} 

... ale dane nie dotarł metody, pojawia się błąd 404. Myślę, że modelbinder może” t działa.

Co działa na dane, które są wysyłane z imieniem firstName = Peter, ale to, co faktycznie zostało wysłane, to RegisterUseraccount.FirstName = Peter.

Jak mogę sobie z tym poradzić?

+0

Czy jesteś pewien, że 'url' jest poprawna? – Zabavsky

+0

Gdzie nazywasz metodę "sendForm"? – Shyju

+0

remove 'contentType: 'application/json',' –

Odpowiedz

21

usunąć contentType: 'application/json', i zmodyfikować go lepiej (z mojego punktu widzenia)

$('#registerUseraccountForm').submit(function() { 
    if ($(this).valid()) { 
     $.ajax({ 
      url: this.action, 
      type: this.method, 
      data: $(this).serialize(), 
      beforeSend: function() { 

      }, 
      complete: function() { 

      }, 
      ... 
+2

Miałeś rację, musiałem tylko usunąć contentType ... Dziękuję! – mosquito87

2

Może masz ten model

public class YourModel 
{ 
    public RegisterUseraccount RegisterUseraccount { get; set; } 
} 

W tym przypadku trzeba umieścić model, który odpowiada Twoim działania:

[HttpPost] 
public ActionResult Register(YourModel model) 
{ 
    var registerUseraccount = model.RegisterUseraccount; 
    ... 
} 

Lub:

@using (Html.BeginForm("Register", "Useraccount", FormMethod.Post, new { id = "registerUseraccountForm", @class = "ym-form" })) 
{ 
    @{ Html.RenderPartial("RegisterUseraccount"); } 
} 

RegisterUseraccount.cshtml

@model YourNamespace.RegisterUseraccount 

@Html.ValidationSummary(true)   

<div class="ym-grid"> 
    <div class="ym-g50 ym-gl"> 
     <div class="ym-fbox-text"> 
      @Html.LabelForRequired(model => model.FirstName, null)    
      @Html.EditorFor(model => model.FirstName, new { required = "required", name = "firstName" }) 
      @Html.ValidationMessageFor(model => model.FirstName)     
     </div> 
    </div> 

ale będziesz musiał zmienić niektóre rzeczy jak @Html.ValidationSummary (true).

Edit

lub najbardziej prosta:

data: $("#registerUseraccountForm").serialize().replace("RegisterUseraccount.",""), 

Edycja II

data: $("#registerUseraccountForm").serialize().replace(/RegisterUseraccount./g,""), 
+0

.replace() zastępuje tylko pierwszą instancję łańcucha, więc nie działa. – mosquito87

+0

To zadziałało: var data = $ ("# registerUseraccountForm"). Serialize(). Replace (nowy RegExp ("RegisterUseraccount.", "G"), "'); – mosquito87

+1

@ mosquito87 dzięki za komentarze, już naprawiłem kod javascript –