sourcecode

AJAX를 통해 어레이를 mvc Action에 전달

copyscript 2023. 8. 7. 22:53
반응형

AJAX를 통해 어레이를 mvc Action에 전달

AJAX를 통해 MVC 작업에 int 배열(또는 IEnumberable)을 전달하려고 하는데 도움이 필요합니다.

자바스크립트는

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

도와주셔서 대단히 고맙습니다.

데이브

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

jQuery.ajaxSettings.traditional = true

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

과거에 POST를 수행할 때 문제가 발생한 적이 있습니다(정확하게 POST가 수행되고 있는지는 모르겠지만 어레이를 전달할 때는 기존 방식을 true로 설정해야 합니다).

 var arrayOfValues = new Array();

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

이미 여기에 나와 있는 것들에 대해 꽤 늦었지만 다른 대답을 했습니다.

에 대신에 $.ajax속기 함수를 사용하거나 배열을 다음과 같이 전달할 수 있습니다.


GET 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
}


사항

  • 의 부울 매개 변수는 속성에 대한 매개 변수이며 이 매개 변수가 작동하려면 이 매개 변수가 필요합니다.

당신은 이것을 아주 잘 할 수 있을 것입니다.

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

그러면 작업 방법은 다음과 같습니다.

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

당신의 경우, 당신은 단지 당신의 가치를 문자열화하기만 하면 되는 것처럼 보입니다.MVC의 JSON Value Provider가 이를 IE 번호로 다시 변환합니다.

'기존' 옵션을 사용하는 것이 정답입니다.자세한 내용을 알고자 하는 분들을 위해 배경 정보를 좀 더 제공해 드리는 것뿐입니다.

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

여기서는 조금 늦었지만, 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
}

다른 모든 것이 실패하면...

여기 있는 다른 답들은 제 문제를 해결하지 못했습니다.자바스크립트에서 MVC 웹 API 컨트롤러로 GET 메소드 호출을 하고, 그 요청 내에서 정수 배열을 매개 변수로 보내려고 했습니다.여기서 모든 솔루션을 시도했지만 컨트롤러의 매개 변수가 NULL(또는 VB 사용자에게는 없음)로 표시되었습니다.

저는 결국 다른 SO 게시물에서 제 솔루션을 찾았고, 실제로 매우 단순했습니다. 다음과 같이 추가하면 됩니다.[FromUri]컨트롤러의 배열 매개 변수 앞에 주석을 추가합니다(괄호 주석을 피하기 위해 "기존" AJAX 설정을 사용하여 호출해야 했습니다).응용 프로그램에서 사용한 실제 코드는 아래를 참조하십시오.


컨트롤러 서명:

Controller Signature 참고: C#의 주석은 다음과 같습니다. [FromUri]


JavaScript:

$.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

ASP로 마이그레이션하는 경우.에서 NET Core MVC.Net Framework 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 )

ASP를 사용하는 경우.NET Core MVC와 각괄호를 처리해야 합니다(jQuery "traditional" 옵션을 사용하는 대신). 내가 찾은 유일한 옵션은 수동으로 구축하는 입니다.IEnumerable콘트롤러 방식으로.

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

저는 asp.net core 2.2 및 jquery에서 작업하고 있으며 뷰에서 복잡한 객체('메인 클래스')를 간단한 데이터 필드와 일부 어레이가 있는 컨트롤러에 제출해야 합니다.
c# 'main class' 정의에서 배열을 추가하고(아래 참조), ajax(포스트)를 통해 (정확하게 채워진) 배열을 제출하자마자, 전체 개체가 컨트롤러에서 null이었습니다.
먼저, 저는 아약스 호출에 "전통적인: 사실"이 누락된 것이 원인이라고 생각했지만, 사실은 그렇지 않습니다.
저의 경우 그 이유는 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 호출에 대해 "true traditional: true"와 함께 또는 없이 작동합니다.

par1이 배열인 곳에서 더 많은 매개 변수를 전달해야 하는 경우, JSON은 모든 매개 변수를 포함해야 합니다. 저는 다음 코드를 사용했습니다.

$.ajax({
type: "POST",
url: URL,                    
data: JSON.stringify({ par1: val1, par2: val2 }),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {},
error: function (result) {}
});

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

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

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

public ActionResult MyAction(int[] arrayOfValues )

언급URL : https://stackoverflow.com/questions/5489461/pass-array-to-mvc-action-via-ajax

반응형