Search code examples
asp.net-mvcasp.net-mvc-3jquery

Model binding with jquery ajax serialize not working


I have the following model:

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; }

    ...
}

And the following view:

@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>
    ...

and my 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.');
        }
    });

This is the result of the serialization:

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

This is my controller method I'm trying to POST to:

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

... but the data doesn't arrive at the method, I get an error 404. I think the modelbinder can't work.

What works is data which is sent with the name firstName=Peter, but what actually is sent is RegisterUseraccount.FirstName=Peter.

How can I handle this problem?


Solution

  • remove contentType: 'application/json', and modify it to better (from my perspective)

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