2

I am using razor and I'm having a hard time passing an array to a controller. the array contains objects that I made and I am trying to do this:

$.ajax({
     type: "POST",
     url: "HomePage/HandleOperations",
     data: JSON.stringify(operationCollection),
     success: function (data) { alert("SUCESS");},
     dataType: "json",
     contentType: "application/json"
});

and my controller is:

 public void HandleOperations(List<string> operationCollection)
 {

 }

I am not required to use ajax but I am not sure how else it could be done. In the controller it shows that the "operationCollection" contains elements but they are all null.

4
  • 1
    Side note - You don't need to call JSON.stringify, jQuery (or XHR2) will do this for you. Commented Aug 7, 2013 at 19:56
  • did you try adding traditional: true to your ajax options? Commented Aug 7, 2013 at 19:57
  • still same problem, it shows the right number of elements but they are all null Commented Aug 7, 2013 at 19:59
  • Have you tried with string[] instead? Commented Aug 7, 2013 at 20:05

4 Answers 4

11

the Ajax parameter

traditional : true

will do the trick.

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

2 Comments

What do you mean? Where should I write traditional??
$.ajax({ type: "POST", url: "HomePage/HandleOperations", data: {operations: operationCollection}, traditional: true, success: function (data) { alert("SUCCESS"); } });
4

Usage of the traditional: true parameter for an ajax call:

To help radbyx, using the "traditional: true" property of an ajax call, like the following, will tell ajax to use the traditional form of serialization. More details: http://api.jquery.com/jQuery.param/ or What is "traditional style of param serialization' in JQuery.

$.ajax({
     type: "POST",
     url: "HomePage/HandleOperations",
     data: {operations: operationCollection},
     traditional: true,
     success: function (data) { alert("SUCCESS"); }
});

Comments

3

Client side:

$.ajax({
     type: "POST",
     url: "HomePage/HandleOperations",
     data: {operations: operationCollection},
     success: function (data) { alert("SUCCESS"); }
});

and declare a class server side like this:

public class Operation
{
  public int Index;
  public string Source;
  public string Target;
  public int AddOrDel;
}

then you can have this action:

public void HandleOperations(Operation[] operations)
{
}

4 Comments

this works! I did not know that I need a model for it. Thanks
Well, need and need, you will get the opportunity to put words on the items, they are after all operations :)
In the json version, you keep the call to JSON.Stringify, and dataType: "json" and have an action that takes a string as parameter, public void HandleOperations(string operations), then you call var operationArr = JavaScriptSerializer.Deserialize<Operation>(operations);, you need to add a reference to System.Web.Extensions to your project
you actually dont need a model, using traditional:true will do it in ajax post.
-1

Add "traditional:true" parameter in your ajax.

Example:

var parentValueToPush=new Array();
$('[name=SelectedUsers]:checked').each(function () {
            parentValueToPush.push($(this).val());
            temp.push($(this).val());
        });
        $.ajax({
            url: //URL,
            type: 'get',
            traditional: true,
            dataType: 'html',
            cache: false,
            data: { SelectedUsers: parentValueToPush},
            success: function (data) {
                   //Result
            }
        });

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.