AJAX를 통해 mvc 작업에 배열 전달


123

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에 전달해야합니까?

도움을 주셔서 감사합니다

데이브

답변:


149

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

jQuery.ajaxSettings.traditional = true

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

3
감사합니다! 전통적인 아약스와 비 전통적인 아약스의 차이점을 설명해 주시겠습니까? 나머지 응용 프로그램에 대해 수행중인 작업을 더 잘 이해하고 싶습니다.
Tom Beech

5
단일 통화에 기존 설정을 추가 할 수도 있습니다. 그러면 나머지에는 영향을주지 않습니다
Gluip 2013

1
이 대답은 정확하지만 단일 통화에 대해 "전통적"을 설정하려면 @RionWilliams 응답을 확인하십시오. 둘 다 투표합니다. 감사!
kzfabi

@Tom Beech jQuery 1.4부터 $ .param () 메서드는 PHP 및 Ruby on Rails와 같은 최신 스크립팅 언어 및 프레임 워크를 수용하기 위해 심층 객체를 재귀 적으로 직렬화합니다. jQuery.ajaxSettings.traditional = true를 설정하여이 기능을 전역 적으로 비활성화 할 수 있습니다.
Alexey Shevelyov 2011

이 답변 중 어느 것도 저에게 효과가 없었지만 (내 컨트롤러가 API 컨트롤러 였기 때문일까요?), 다음 SO 답변에서 솔루션을 찾았습니다. stackoverflow.com/a/11100414/1751792
Lopsided

119

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

 var arrayOfValues = new Array();

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

4
이것은 어떤 사람들이 제안하는 것처럼 web.config 파일에서 맹목적으로 전역으로 설정하는 것보다 훨씬 낫습니다. 다른 하나는 자체적으로 좋은 경우가 있지만 기본 솔루션은 귀하의 것이되어야합니다.
Panzercrisis

이것은 데이터를 ActionResult에 매개 변수로 보내는 것입니다. ActionResult 내부 코드를 호출합니까? 예를 들어 arrayofvalues를 데이터베이스에 삽입하는 코드가 있다면 해당 코드가 실행됩니까?
Saurabh

이것은 내가 필요한 것을 정확히 해결했습니다. 내 배열은 내가 이것을 추가하고 내 컨트롤러에서 다음과 같이 얻을 때까지 컨트롤러에서 null로 계속 돌아 왔습니다. IEnumerable <string> array
SeanMC

52

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

대신의 경우 $.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 .

2
전통적인 속성에 대한 팁을 주셔서 감사합니다. 내 C # 매개 변수가 null 인 이유를 알 수 없습니다. "int []"유형이 C # Action 메서드에서도 작동한다는 것을 알았습니다.
Dan Randolph

9

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

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

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

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

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


답 해주셔서 감사하지만 전통을 참으로 설정해야 할 것 같습니다. 이것도 효과가 있다고 생각하는대로 upvoted했습니다.
Dave

9

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

jQuery 문서에서 :

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

http://michaelsync.net/2012/04/05/tips-asp-net-mvc-javascriptserializer-3-questions-and-3-answershttp://haacked.com/archive에서 자세한 내용을 읽을 수도 있습니다 . /2008/10/23/model-binding-to-a-list.aspx

HTH


2

그렇지 않은 경우 ...

여기에 다른 답변 중 어느 것도 내 문제를 해결하지 못했습니다. 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

2

조금 늦었지만 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
}

1

나처럼 .Net Framework MVC에서 ASP.NET Core MVC로 마이그레이션하는 경우 상황이 약간 변경되었습니다. ajax 호출은 stringify를 사용하여 원시 객체에 있어야하므로 데이터를 전달하는 대신 다음과 { vals: arrayOfValues }같아야 JSON.stringify(arrayOfValues)합니다.

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

ASP.NET Core에서 변경된 또 다른 변경 사항은 사이트 간 요청 위조를 방지하는 것이므로 ajax 메서드에서 MVC 작업을 호출하려면 [FromBody]다음과 같이 속성을 작업 매개 변수에 적용해야합니다.

public ActionResult MyAction([FromBody] IEnumerable<int> arrayOfValues )

데이터를 전송하는 방법의 다른 모든 순열이 실패한 후에 이것이 매우 도움이되었습니다. 감사합니다!
NibblyPig

0

ASP.NET Core MVC를 사용 중이고 대괄호를 처리해야하는 경우 (jQuery "전통적인"옵션을 사용하는 대신) 내가 찾은 유일한 옵션 IEnumerable은 contoller 메서드에서 수동으로 빌드하는 것 입니다.

string arrayKey = "p[]=";
var pArray = HttpContext.Request.QueryString.Value
    .Split('&')
    .Where(s => s.Contains(arrayKey))
    .Select(s => s.Substring(arrayKey.Length));

0

저는 asp.net core 2.2 및 jquery로 작업 하고보기에서 간단한 데이터 필드와 일부 배열이있는 컨트롤러로 복잡한 개체 ( '기본 클래스')를 제출해야합니다.
c # 'main class'정의 (아래 참조)에 배열을 추가하고 ajax (post)를 통해 (올바른 채워진) 배열을 제출하자마자 전체 개체가 컨트롤러에서 null이되었습니다.
첫째, 내 ajax 호출에 "전통적 : 사실"이 누락 된 것이 이유라고 생각했지만 그렇지 않습니다.
제 경우 그 이유는 C # '메인 클래스'의 정의였습니다.
'메인 클래스'에서 나는 다음을 가졌다.

public List<EreignisTagNeu> oEreignistageNeu { get; set; }

EreignisTagNeu는 다음과 같이 정의되었습니다.

public class EreignisTagNeu
{
 public int iHME_Key { get; set; } 
}

'메인 클래스'의 정의를 다음과 같이 변경해야했습니다.

 public List<int> oEreignistageNeu { get; set; }

이제 작동합니다.
그래서 ... 저에게는 asp.net 코어에 문제가있는 것 같습니다 (게시물 포함), 배열 목록이 '메인 클래스'에서 완전히 정의되지 않은 경우.
참고 : 제 경우에는 ajax 호출에 대해 "전통적 : 참"을 사용하거나 사용하지 않고 작동합니다.


-3

배열을 문자열로 변환해야합니다.

//arrayOfValues = [1, 2, 3];  
$.get('/controller/MyAction', { arrayOfValues: "1, 2, 3" }, function (data) {...

이것은 int, long 또는 string 형태로도 작동합니다.

public ActionResult MyAction(int[] arrayOfValues )

이것은 서버에 배열을 보내는 올바른 구문이 아닙니다. 당신은 객체를 전달하고 그것이 배열이라고 가정하고 있습니다. 이것은 STRING 인 당신이 제공 한 것과는 결코 일치하지 않을 것입니다.
Twister1002 2017-04-23
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.