programing

문자열 배열을 ASP에 게시하려면 어떻게 해야 합니까?폼이 없는 NET MVC 컨트롤러

batch 2023. 2. 25. 20:09
반응형

문자열 배열을 ASP에 게시하려면 어떻게 해야 합니까?폼이 없는 NET MVC 컨트롤러

저는 ASP를 독학하기 위해 작은 앱을 만들고 있습니다.NET MVC 및 JQuery 페이지 중 하나는 선택 가능한 항목 목록입니다.그런 다음 JQuery의 Post 기능을 사용하여 선택한 항목의 ID를 포함한 목록(또는 동등한 것)을 컨트롤러로 보내고 싶습니다.

선택한 요소의 ID를 사용하여 어레이를 얻을 수 있었습니다.이것을 투고합니다.이것을 할 수 있는 한 가지 방법은 페이지에 숨겨진 값이 있는 더미 폼을 만들고 선택한 아이템으로 숨겨진 값을 설정하고 그 폼을 투고하는 것입니다만, 이 폼은 더 엄격해 보입니다.

어레이를 컨트롤러로 직접 전송함으로써 이를 보다 깔끔하게 수행할 수 있는 방법이 있습니까?몇 가지 시도를 해봤지만 컨트롤러가 수신 데이터를 매핑할 수 없는 것 같습니다.지금까지의 코드는 다음과 같습니다.

function generateList(selectedValues) {
   var s = {
      values: selectedValues //selectedValues is an array of string
   };
   $.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json");
}

그리고 컨트롤러는 이렇게 생겼습니다.

public ActionResult GenerateList(List<string> values)
{
    //do something
}

제가 알아낸 건 컨트롤러 파라미터에 "null"이 있다는 것뿐이에요

팁이 있나요?

테스트 앱 코드를 포함하도록 답변을 수정했습니다.

업데이트: 다시 작동하도록 jQuery를 업데이트하여 '기존' 설정을 true로 설정했습니다(@DustinDavis의 답변).

먼저 javascript:

function test()
{
    var stringArray = new Array();
    stringArray[0] = "item1";
    stringArray[1] = "item2";
    stringArray[2] = "item3";
    var postData = { values: stringArray };
    
    $.ajax({
        type: "POST",
        url: "/Home/SaveList",
        data: postData,
        success: function(data){
            alert(data.Result);
        },
        dataType: "json",
        traditional: true
    });
}

컨트롤러 클래스의 코드는 다음과 같습니다.

public JsonResult SaveList(List<String> values)
{
    return Json(new { Result = String.Format("Fist item in list: '{0}'", values[0]) });
}

javascript 함수를 호출하면 "목록의 첫 번째 항목: item1"이라는 알림이 나타납니다.

참고로 JQuery는 포스트 데이터를 시리얼화하는 방법을 변경했습니다.

http://forum.jquery.com/topic/nested-param-serialization

'전통' 설정을 true 또는 wise로 설정해야 합니다.

{ Values : ["1", "2", "3"] }

로서 나올 것이다.

Values[]=1&Values[]=2&Values[]=3

대신

Values=1&Values=2&Values=3

답변해 주셔서 감사합니다.다른 빠른 해결책은 jQuery.param 메서드를 true로 설정기존 파라미터를 사용하여 JSON 객체를 문자열로 변환하는 것입니다.

$.post("/your/url", $.param(yourJsonObject,true));

데이터를 배열로 게시하지 마십시오.목록에 바인드하려면 키/값 쌍을 각 키에 대해 동일한 값으로 전송해야 합니다.

이 작업을 수행하기 위해 양식이 필요하지 않습니다.$.post 콜에 포함할 수 있는 키/값 쌍 리스트만 있으면 됩니다.

.NET4.5,MVC 5

Javascript:

JS의 객체:여기에 이미지 설명 입력

포스트하는 메커니즘입니다.

    $('.button-green-large').click(function() {
        $.ajax({
            url: 'Quote',
            type: "POST",
            dataType: "json",
            data: JSON.stringify(document.selectedProduct),
            contentType: 'application/json; charset=utf-8',
        });
    });

C#

오브젝트:

public class WillsQuoteViewModel
{
    public string Product { get; set; }

    public List<ClaimedFee> ClaimedFees { get; set; }
}

public partial class ClaimedFee //Generated by EF6
{
    public long Id { get; set; }
    public long JourneyId { get; set; }
    public string Title { get; set; }
    public decimal Net { get; set; }
    public decimal Vat { get; set; }
    public string Type { get; set; }

    public virtual Journey Journey { get; set; }
}

컨트롤러:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Quote(WillsQuoteViewModel data)
{
....
}

수신된 개체:

여기에 이미지 설명 입력

이것으로 시간을 절약하시길 바랍니다.

문자열뿐만 아니라 오브젝트 목록으로도 동작하는 다른 구현:

JS:

var postData = {};
postData[values] = selectedValues ;

$.ajax({
    url: "/Home/SaveList",
    type: "POST",
    data: JSON.stringify(postData),
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    success: function(data){
        alert(data.Result);
    }
});

'selectedValues'가 객체 배열이라고 가정합니다.

컨트롤러에서 파라미터는 대응하는 ViewModel 목록입니다.

public JsonResult SaveList(List<ViewModel> values)
{    
    return Json(new { 
          Result = String.Format("Fist item in list: '{0}'", values[0].Name) 
    });
}

여기서도 말씀드렸듯이

커스텀 JSON 오브젝트를 MVC 액션에 넘기고 싶다면 이 솔루션을 사용하면 매우 효과적입니다.

public string GetData() {
  // InputStream contains the JSON object you've sent
  String jsonString = new StreamReader(this.Request.InputStream).ReadToEnd();

  // Deserialize it to a dictionary
  var dic =
    Newtonsoft.Json.JsonConvert.DeserializeObject < Dictionary < String,
    dynamic >> (jsonString);

  string result = "";

  result += dic["firstname"] + dic["lastname"];

  // You can even cast your object to their original type because of 'dynamic' keyword
  result += ", Age: " + (int) dic["age"];

  if ((bool) dic["married"])
    result += ", Married";

  return result;
}

이 솔루션의 진정한 장점은 인수의 각 조합에 대해 새로운 클래스를 정의할 필요가 없으며, 그 외에도 개체를 원래 유형으로 쉽게 캐스팅할 수 있다는 것입니다.

다음과 같은 도우미 방법을 사용하여 작업을 원활하게 수행할 수 있습니다.

public static Dictionary < string, dynamic > GetDic(HttpRequestBase request) {
  String jsonString = new StreamReader(request.InputStream).ReadToEnd();
  return Newtonsoft.Json.JsonConvert.DeserializeObject < Dictionary < string, dynamic >> (jsonString);
}

글로벌 파라미터를 설정할 수 있습니다.

jQuery.ajaxSettings.traditional = true;

그 답변이 제 상황에 많은 도움이 되었기 때문에 감사합니다.단, 향후 참조를 위해 모델에 바인드한 후 검증해야 합니다.이 글은 MVC 2에 대한 Phil Hack의 글입니다.http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx

이게 도움이 됐으면 좋겠네요.

언급URL : https://stackoverflow.com/questions/309115/how-can-i-post-an-array-of-string-to-asp-net-mvc-controller-without-a-form

반응형