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

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.