[C#] AJAX를 통해 mvc 작업에 배열 전달

AJAX를 통해 int 배열 (또는 IEnumerable)을 MVC 작업으로 전달하려고하는데 약간의 도움이 필요합니다.

자바 스크립트는

$.get('/controller/MyAction', { vals: arrayOfValues }, function (data) {...

컨트롤러 동작은

public ActionResult MyAction(IEnumerable<int> arrayOfValues )

현재 요청 형식은 다음과 같습니다.

controller/MyAction?_=1301503418429&arrayOfValues[]=491&arrayOfValues[]=368&arrayOfValues[]=235&arrayOfValues[]=437

그래서 거의 다 왔는데, 대괄호를 제거하면 정확한 응답을 얻습니다. 컨트롤러가 그것이 무엇인지 인식 할 수 있도록 어떻게 해당 배열을 get에 전달해야합니까?

도움을 주셔서 감사합니다

데이브



답변

get 호출을하기 전에 기존 속성을 true로 설정합니다. 즉 :

jQuery.ajaxSettings.traditional = true

$.get('/controller/MyAction', { vals: arrayOfValues }, function (data) {... 


답변

POST를 수행하려고 할 때 과거에 문제가 발생했습니다 (정확히 수행중인 작업인지 확실하지 않지만 배열을 전달할 때 기억 합니다 . Traditional을 true로 설정해야합니다 .

 var arrayOfValues = new Array();

 //Populate arrayOfValues 
 $.ajax({
      type: "POST",
      url: "<%= Url.Action("MyAction","Controller")%>",
      traditional: true,
      data: { 'arrayOfValues': arrayOfValues }
 });


답변

꽤 늦었지만 이미 여기에있는 것들에 대한 다른 대답 :

대신의 경우 $.ajax당신 속기 기능을 사용하고 싶습니다 $.get$.post당신이 배열이 방법을 전달할 수 :

속기 GET

var array = [1, 2, 3, 4, 5];
$.get('/controller/MyAction', $.param({ data: array }, true), function(data) {});

// Action Method
public void MyAction(List<int> data)
{
    // do stuff here
}

속기 POST

var array = [1, 2, 3, 4, 5];
$.post('/controller/MyAction', $.param({ data: array }, true), function(data) {});

// Action Method
[HttpPost]
public void MyAction(List<int> data)
{
    // do stuff here
}

노트:

  • 의 부울 매개 변수 $.paramtraditional속성에 대한 것이며
    이것이 작동하려면 반드시 있어야합니다true .

답변

이 작업을 잘 수행 할 수 있어야합니다.

$.ajax({
   url: 'controller/myaction',
   data: JSON.stringify({
      myKey: myArray
   }),
   success: function(data) { /* Whatever */ }
});

그러면 당신의 행동 방법은 다음과 같습니다.

public ActionResult(List<int> myKey)
{
    // Do Stuff
}

당신에게는 당신의 가치를 문자열 화해야 할 것 같습니다. MVC의 JSONValueProvider는이를 IEnumerable로 다시 변환합니다.


답변

‘전통적인’옵션을 사용하는 답은 맞습니다. 나는 더 많은 것을 배우고 싶은 사람들을 위해 더 많은 배경 정보를 제공하고 있습니다.

jQuery 문서에서 :

jQuery 1.8부터 $ .param () 메서드는 더 이상 jQuery.ajaxSettings.traditional을 기본 설정으로 사용하지 않으며 기본값은 false입니다.

http://michaelsync.net/2012/04/05/tips-asp-net-mvc-javascriptserializer-3-questions-and-3-answers

http://haacked.com/archive에서 자세한 내용을 읽을 수도 있습니다
. /2008/10/23/model-binding-to-a-list.aspx

HTH


답변

그렇지 않은 경우 …

여기에 다른 답변 중 어느 것도 내 문제를 해결하지 못했습니다. JavaScript에서 MVC Web API 컨트롤러로 GET 메서드를 호출하고 해당 요청 내에서 정수 배열을 매개 변수로 보내려고했습니다. 여기에서 모든 솔루션을 시도했지만 여전히 컨트롤러의 매개 변수가 NULL (또는 VB 사용자에게는 Nothing)로 표시됩니다.

결국 다른 SO 게시물 에서 내 솔루션을 찾았고 실제로는 매우 간단했습니다. [FromUri]컨트롤러의 배열 매개 변수 앞에 주석을 추가 하기 만하면 됩니다 ( 대괄호 주석을 피하기 위해 “전통적인”AJAX 설정을 사용하여 호출해야했습니다 ). 내 응용 프로그램에서 사용한 실제 코드는 아래를 참조하십시오.


컨트롤러 서명 :

컨트롤러 서명
참고 : C #의 주석은 [FromUri]


자바 스크립트 :

$.get('/api/InventoryApi/GetBalanceField', $.param({productIds: [42], inventoryFormId: 5493, inventoryBalanceType: 'Beginning'},true)).done(function(data) {console.log(data);});

실제 URL 문자열 :

http://randomhostname/api/InventoryApi/GetBalanceField?productIds=42&inventoryFormId=5493&inventoryBalanceType=Beginning


답변

조금 늦었지만 SNag의 솔루션을 $ .ajax ()에 더 사용할 수 있습니다. 누구에게나 도움이된다면 다음 코드가 있습니다.

var array = [1, 2, 3, 4, 5];

$.ajax({
    type: "GET",
    url: '/controller/MyAction',
    data: $.param({ data: array}, true),
    contentType: 'application/json; charset=utf-8',
    success: function (data) {
    },
    error: function (x, y, z) {
    }
});

// Action Method
public void MyAction(List<int> data)
{
    // do stuff here
}