1

My MVC 3 controller action is not deserializing the JSON data from my AJAX post.

  • Fiddler shows the data being passed correctly.
  • I put a break point on the var x = "ok!"; line and it hits it every time.
  • When the contentType is removed from the .ajax(), the address object is created but properties are null values.
  • With the contentType in the request, the address object is null.
  • I've tried to put [DataContract] and [DataMembers] on my POCO, no difference
  • I've tried to use an IModelBinder, but the StreamReader(Request.InputStream).ReadToEnd was always ""

Here's the jQuery code:

 $("#home-validate-btn").click(function (event) {
    var address =
    {
        Address: $('#Data_HomeAddress').val(),
        City: $('#Data_HomeCity').val(),
        State: $('#Data_HomeState').val(),
        Zip: $('#Data_HomeZip').val()
    };

    $.ajax({
        url: '/Settings/addressValidate',
        type: 'POST',
        contentType: 'application/json; charset=utf-8', 
        dataType: 'json',
        data: $.toJSON(address),            
        success: function (info) {
            alert('ok!');
        }
    });
});

Here's the controller code:

 [AcceptVerbs(HttpVerbs.Post)]         
    public ActionResult addressValidate(ValidateAddress address)
    {
        var x = "ok!";
        return new JsonResult()
        {
            Data = (x),
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };
    }

My POCO:

public class ValidateAddress
{        
    public string Address { get; set; }        
    public string City { get; set; }        
    public string State { get; set; }   
    public string Zip { get; set; }
}

My Global.asax.cs

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}", // URL with parameters
            new
            {
                controller = "Home",
                action = "Index"
            } // Parameter defaults
        );
    }

protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
    }

Here's the data from Fiddler:

  • POST http://localhost.:59872/Settings/addressValidate HTTP/1.1
  • x-requested-with: XMLHttpRequest
  • Accept-Language: en-us
  • Referer: http://localhost.:59872/Settings/Addresses?Length=8
  • Accept: application/json, text/javascript, */*; q=0.01
  • Content-Type: application/json; charset=utf-8
  • Accept-Encoding: gzip, deflate
  • User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; OfficeLiveConnector.1.5; OfficeLivePatch.1.3; .NET4.0C; .NET4.0E; Creative AutoUpdate v1.40.01; msn OptimizedIE8;ENUS)
  • Host: localhost.:59872
  • Content-Length: 77
  • Connection: Keep-Alive
  • Pragma: no-cache
  • Cookie: __RequestVerificationToken_Lw__=IBBY7VzoqxMI .... (rest of string snipped)
  • ASP.NET_SessionId=fsjywpn4gqasszgcdgmkqd4p
  • {"Address":"1 Main Street","City":"Beach City","State":"FL","Zip":"99999"}

1 Answer 1

2

The problem was that I needed to encapsulate the return data in an object named "address" to match the method definition. I was passing an array instead of an object with properties.

New JSON =

var addressObj = {
        address: {
            Address: $('#Data_HomeAddress').val(),
            City: $('#Data_HomeCity').val(),
            State: $('#Data_HomeState').val(),
            Zip: $('#Data_HomeZip').val()
        }
    };

in the .ajax() - data: $.toJSON(addressObj),

Old JSON =

var address =
{
    Address: $('#Data_HomeAddress').val(),
    City: $('#Data_HomeCity').val(),
    State: $('#Data_HomeState').val(),
    Zip: $('#Data_HomeZip').val()
};

the old .ajax() had - data: $.toJSON(address),

http://forums.asp.net/p/1642394/4252987.aspx#4252987

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.