Programing

JSON, jQuery를 사용하여 복잡한 개체 배열을 ASP.NET MVC 컨트롤러에 게시하는 방법은 무엇입니까?

lottogame 2020. 9. 1. 07:56
반응형

JSON, jQuery를 사용하여 복잡한 개체 배열을 ASP.NET MVC 컨트롤러에 게시하는 방법은 무엇입니까?


내 현재 코드는 다음과 같습니다. 어레이를 컨트롤러에 전달하려면 어떻게해야하며 컨트롤러 작업이 허용해야하는 매개 변수의 종류는 무엇입니까?

function getplaceholders() {
    var placeholders = $('.ui-sortable');
    var result = new Array();
    placeholders.each(function() {
        var ph = $(this).attr('id');
        var sections = $(this).find('.sort');
        var section;

        sections.each(function(i, item) {
            var sid = $(item).attr('id');

            result.push({ 'SectionId': sid, 'Placeholder': ph, 'Position': i });
        });
    });
    alert(result.toString());
    $.post(
        '/portal/Designer.mvc/SaveOrUpdate',
        result,
        function(data) {
            alert(data.Result);
        }, "json");
};

내 컨트롤러 작업 방법은 다음과 같습니다.

public JsonResult SaveOrUpdate(IList<PageDesignWidget> widgets)

해결책을 찾았습니다. 나는 Steve Gentile, jQuery 및 ASP.NET MVC 의 솔루션을 사용합니다 . – JSON을 Action으로 보내기 – Revisited .

내 ASP.NET MVC보기 코드는 다음과 같습니다.

function getplaceholders() {
        var placeholders = $('.ui-sortable');
        var results = new Array();
        placeholders.each(function() {
            var ph = $(this).attr('id');
            var sections = $(this).find('.sort');
            var section;

            sections.each(function(i, item) {
                var sid = $(item).attr('id');
                var o = { 'SectionId': sid, 'Placeholder': ph, 'Position': i };
                results.push(o);
            });
        });
        var postData = { widgets: results };
        var widgets = results;
        $.ajax({
            url: '/portal/Designer.mvc/SaveOrUpdate',
            type: 'POST',
            dataType: 'json',
            data: $.toJSON(widgets),
            contentType: 'application/json; charset=utf-8',
            success: function(result) {
                alert(result.Result);
            }
        });
    };

내 컨트롤러 작업은 사용자 정의 속성으로 장식되어 있습니다.

[JsonFilter(Param = "widgets", JsonDataType = typeof(List<PageDesignWidget>))]
public JsonResult SaveOrUpdate(List<PageDesignWidget> widgets

사용자 정의 속성에 대한 코드는 여기 에서 찾을 수 있습니다 (지금 링크가 끊어짐).

링크가 끊어 졌기 때문에 이것은 JsonFilterAttribute에 대한 코드입니다.

public class JsonFilter : ActionFilterAttribute
{
    public string Param { get; set; }
    public Type JsonDataType { get; set; }
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Request.ContentType.Contains("application/json"))
        {
            string inputContent;
            using (var sr = new StreamReader(filterContext.HttpContext.Request.InputStream))
            {
                inputContent = sr.ReadToEnd();
            }
            var result = JsonConvert.DeserializeObject(inputContent, JsonDataType);
            filterContext.ActionParameters[Param] = result;
        }
    }
}

JsonConvert.DeserializeObject는 Json.NET에서 가져온 것입니다.

링크 : Json.NET으로 JSON 직렬화 및 역 직렬화


액션 필터, jquery stringify, bleh ...

Peter,이 기능은 MVC의 기본 기능입니다. 이것이 MVC를 훌륭하게 만드는 요소 중 하나입니다.

$.post('SomeController/Batch', { 'ids': ['1', '2', '3']}, function (r) {
   ...
});

그리고 행동에서

[HttpPost]
public ActionResult Batch(string[] ids)
{
}

매력처럼 작동 :

여기에 이미지 설명 입력

jQuery 1.4 이상을 사용하는 경우 기존 모드 설정을 살펴보고 싶습니다.

jQuery.ajaxSettings.traditional = true;

여기에 설명 된대로 : http://www.dovetailsoftware.com/blogs/kmiller/archive/2010/02/24/jquery-1-4-breaks-asp-net-mvc-actions-with-array-parameters

이것은 복잡한 개체에도 적용됩니다. 관심이 있으시면 모델 바인딩에 대한 MVC 설명서를 참조 하십시오 . http://msdn.microsoft.com/en-us/library/dd410405.aspx


에서 .NET4.5, MVC 5위젯 필요가 없습니다.

자바 스크립트 :

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

게시하는 메커니즘.

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

씨#

사물:

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)
{
....
}

받은 물건 :

여기에 이미지 설명 입력

이것이 시간을 절약하기를 바랍니다.


Towards the second half of Create REST API using ASP.NET MVC that speaks both JSON and plain XML, to quote:

Now we need to accept JSON and XML payload, delivered via HTTP POST. Sometimes your client might want to upload a collection of objects in one shot for batch processing. So, they can upload objects using either JSON or XML format. There's no native support in ASP.NET MVC to automatically parse posted JSON or XML and automatically map to Action parameters. So, I wrote a filter that does it."

He then implements an action filter that maps the JSON to C# objects with code shown.


First download this JavaScript code, JSON2.js, that will help us serialize the object into a string.

In my example I'm posting the rows of a jqGrid via Ajax:

    var commissions = new Array();
    // Do several row data and do some push. In this example is just one push.
    var rowData = $(GRID_AGENTS).getRowData(ids[i]);
    commissions.push(rowData);
    $.ajax({
        type: "POST",
        traditional: true,
        url: '<%= Url.Content("~/") %>' + AREA + CONTROLLER + 'SubmitCommissions',
        async: true,
        data: JSON.stringify(commissions),
        dataType: "json",
        contentType: 'application/json; charset=utf-8',
        success: function (data) {
            if (data.Result) {
                jQuery(GRID_AGENTS).trigger('reloadGrid');
            }
            else {
                jAlert("A problem ocurred during updating", "Commissions Report");
            }
        }
    });

이제 컨트롤러에서 :

    [HttpPost]
    [JsonFilter(Param = "commissions", JsonDataType = typeof(List<CommissionsJs>))]
    public ActionResult SubmitCommissions(List<CommissionsJs> commissions)
    {
        var result = dosomething(commissions);
        var jsonData = new
        {
            Result = true,
            Message = "Success"
        };
        if (result < 1)
        {
            jsonData = new
            {
                Result = false,
                Message = "Problem"
            };
        }
        return Json(jsonData);
    }

JsonFilter 클래스를 만듭니다 (JSC 참조 덕분에).

    public class JsonFilter : ActionFilterAttribute
    {
        public string Param { get; set; }
        public Type JsonDataType { get; set; }
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext.HttpContext.Request.ContentType.Contains("application/json"))
            {
                string inputContent;
                using (var sr = new StreamReader(filterContext.HttpContext.Request.InputStream))
                {
                    inputContent = sr.ReadToEnd();
                }
                var result = JsonConvert.DeserializeObject(inputContent, JsonDataType);
                filterContext.ActionParameters[Param] = result;
            }
        }
    }

필터가 JSON 문자열을 실제 조작 가능한 객체로 구문 분석 할 수 있도록 다른 클래스를 만듭니다.이 클래스 comissionsJS는 내 jqGrid의 모든 행입니다.

    public class CommissionsJs
    {
        public string Amount { get; set; }

        public string CheckNumber { get; set; }

        public string Contract { get; set; }
        public string DatePayed { get; set; }
        public string DealerName { get; set; }
        public string ID { get; set; }
        public string IdAgentPayment { get; set; }
        public string Notes { get; set; }
        public string PaymentMethodName { get; set; }
        public string RowNumber { get; set; }
        public string AgentId { get; set; }
    }

이 예제가 복잡한 개체를 게시하는 방법을 설명하는 데 도움이되기를 바랍니다.


세상에. 특별한 일을 할 필요가 없습니다. 게시물 섹션에서만 다음을 수행하십시오.

    $.post(yourURL,{ '': results})(function(e){ ...}

서버에서 다음을 사용하십시오.

   public ActionResult MethodName(List<yourViewModel> model){...}

이 링크 는 당신을 도와줍니다 ...


    [HttpPost]
    public bool parseAllDocs([FromBody] IList<docObject> data)
    {
        // do stuff

    }

참고 URL : https://stackoverflow.com/questions/320291/how-to-post-an-array-of-complex-objects-with-json-jquery-to-asp-net-mvc-control

반응형