programing

MVC ajax json을 컨트롤러에 게시하는 액션 메서드

abcjava 2023. 2. 25. 19:29
반응형

MVC ajax json을 컨트롤러에 게시하는 액션 메서드

복합 오브젝트를 파라미터로 포함하는 컨트롤러 액션메서드에 대한 JQuery AJAX 호출을 실행하려고 합니다.저는 많은 블로그를 읽었고 이것들로부터 배운 몇 가지 기술들을 시도했습니다.제가 베스트 어택 코드를 구축한 주요 포스트(아래)는 stackoverflow 포스트입니다.

사용자가 필드를 탭할 때 호출되는 비동기 투고를 트리거하고 싶다(다른 예시와 같이 폼 저장 투고가 아님).

제 의도는 다음과 같습니다.

  • 클라이언트상의 오브젝트를 인스턴스화한다(View 유형을 제공하는 View Model이 아니다).
  • 뷰 내의 여러 필드의 데이터로 객체를 채웁니다.
  • 이 개체를 JSON으로 변환합니다.
  • jQuery를 사용하여 컨트롤러 액션메서드를 호출합니다.Ajax 메서드, JSON 개체를 전달합니다.

결과는 JSON 결과로 반환되며 반환된 결과에 따라 데이터가 보기의 필드에 로드됩니다.

문제는 다음과 같습니다.

  • 액션 메서드가 HttpPPost Atribut과 함께 설정되어 있는 경우 컨트롤러의 Action 메서드는 호출되지 않습니다(AJAX 콜타입이 'POST'로 설정되어 있어도).
  • 액션 메서드가 HttpGet에 의해 어트리뷰트 되어 있는 경우 파라미터의 속성 값은 null이 됩니다.
  • ReadObject 메서드는 "네임스페이스 "에서 요소 "root"을 예상합니다."라는 오류를 발생시킵니다.이름이 'namespace'인 'None'이 발견되었습니다.

누군가 도와줄 수 있길 바라.감사해요.아래 코드:

클라이언트 js 파일

 var disputeKeyDataObj = {
     "InvoiceNumber": "" + $.trim(this.value) + "",
     "CustomerNumber": "" + $.trim($('#CustomerNumber').val()) + ""
  };

  var disputeKeyDataJSON = JSON.stringify(disputeHeadlineData);      

  $.ajax({
     url: "/cnr/GetDataForInvoiceNumber",
     type: "POST",
     data: disputeKeyDataJSON,
     dataType: 'json',
     contentType: "application/json; charset=utf-8",
     success: EnrichedDisputeKeyData(result)
  });


Action 메서드 매개 변수와 연결된 유형의 Action 필터 및 클래스

 [DataContract]  
 public class DisputeKeyData  
 {  
    [DataMember(Name = "InvoiceNumber")]  
    public string InvoiceNumber { get; set; }

    [DataMember(Name = "CustomerNumber")]
    public string CustomerNumber { get; set; }
 }  

컨트롤러의 액션 방식

  //[HttpPost]
  [ObjectFilter(Param = "disputeKeyData", RootType = typeof(DisputeKeyData))]  
  public ActionResult GetDataForInvoiceNumber(DisputeKeyData disputeKeyData)  
  {  
     //Blah!  
     //....  
     return Json(disputeKeyData, JsonRequestBehavior.AllowGet);  
  }  

아래는 제가 이 작업을 하게 된 방법입니다.

요점은 런타임에서 요청 내의 개체를 해결할 수 있도록 뷰와 관련된 View Model을 사용해야 한다는 것입니다.

[디폴트 View Model 오브젝트 이외의 오브젝트를 바인드할 수 있는 방법이 있다는 것을 알고 있습니다만, 그 오브젝트를 동작시킬 수 없었기 때문에 필요에 따라 필요한 속성을 채우는 것만으로 끝납니다]

[HttpPost]  
  public ActionResult GetDataForInvoiceNumber(MyViewModel myViewModel)  
  {            
     var invoiceNumberQueryResult = _viewModelBuilder.HydrateMyViewModelGivenInvoiceDetail(myViewModel.InvoiceNumber, myViewModel.SelectedCompanyCode);
     return Json(invoiceNumberQueryResult, JsonRequestBehavior.DenyGet);
  }

이 액션 메서드를 호출하기 위해 사용되는 JQuery 스크립트:

var requestData = {
         InvoiceNumber: $.trim(this.value),
         SelectedCompanyCode: $.trim($('#SelectedCompanyCode').val())
      };


      $.ajax({
         url: '/en/myController/GetDataForInvoiceNumber',
         type: 'POST',
         data: JSON.stringify(requestData),
         dataType: 'json',
         contentType: 'application/json; charset=utf-8',
         error: function (xhr) {
            alert('Error: ' + xhr.statusText);
         },
         success: function (result) {
            CheckIfInvoiceFound(result);
         },
         async: true,
         processData: false
      });

언급URL : https://stackoverflow.com/questions/4120212/mvc-ajax-json-post-to-controller-action-method

반응형