user3077725
user3077725

Reputation: 793

MVC Controller post json does not work

I have the this code to post json to a controller.

The problem is that the credentials object does not get populated with the posted values.

How do I change this code so that it works?

I see in Fiddler that the request is being posted correctly.

[HttpPost]
public JsonResult Authenticate(CredentialsModel credentials)
{
    return Json(credentials);
}

[DataContract]
public class CredentialsModel
{
    [DataMember(Name = "user")]
    public string User;
    [DataMember(Name = "pass")]
    public string Pass;
}


$.ajax({
    type: "POST",
    url: "/login/authenticate",
    cache: false,
    contentType: "application/json; charset=utf-8",
    data: '{"user":' + JSON.stringify($('#username').val()) + ',"uass":' + JSON.stringify($('#userpass').val()) + '}',
    dataType: "json",
    timeout: 100,
    success: function (msg) {

    },
    complete: function (jqXHR, status) {
        if (status == 'success' || status == 'notmodified') {


            var obj = jQuery.parseJSON(jqXHR.responseText);

        }
    },
    error: function (req, status, error) {

    }
});

Upvotes: 0

Views: 147

Answers (2)

Anthony Chu
Anthony Chu

Reputation: 37520

The default MVC model binder only works with properties. Your CredentialsModel is using fields. Try changing them to properties. You can also remove the annotations.

public class CredentialsModel
{
    public string User { get; set; }
    public string Pass { get; set; }
}

Also, as pointed out by Sahib, you can create a Javascript Object and then stringify it, rather than stringifying each one. Although that doesn't appear to be the problem in this case.

data: JSON.stringify({
    User: $('#username').val(),
    Pass: $('#userpass').val()
})

Upvotes: 3

MD. Sahib Bin Mahboob
MD. Sahib Bin Mahboob

Reputation: 20514

Try chaning your data like this :

$.ajax({
    .................
    //notice the 'U' and 'P'. I have changed those to exactly match with your model field.
    data: JSON.stringify({User: $('#username').val(),Pass: $('#userpass').val()}),
    .................
});

Upvotes: 0

Related Questions