JSON এর সাথে জটিল বস্তুর একটি অ্যারে কীভাবে পোস্ট করবেন, এএসপি.নেট এমভিসি কন্ট্রোলারে jQuery?


92

আমার বর্তমান কোডটি নীচের মত দেখাচ্ছে। আমি কীভাবে নিয়ন্ত্রণকারীর কাছে আমার অ্যারে পাস করতে পারি এবং আমার নিয়ামক পদক্ষেপটি কী ধরণের পরামিতি গ্রহণ করতে হবে?

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)

উত্তর:


84

আমি একটি সমাধান খুঁজে পেয়েছি। আমি স্টিভ জেন্টিল, jQuery এবং ASP.NET এমভিসি - JSON কে একটি অ্যাকশনে পাঠানো - পুনর্বিবেচিত এর একটি সমাধান ব্যবহার করি ।

আমার এএসপি.নেট এমভিসি ভিউ কোডটি দেখে মনে হচ্ছে:

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

কাস্টম বৈশিষ্ট্যের জন্য কোডটি এখানে পাওয়া যাবে (লিঙ্কটি এখন ভেঙে গেছে)।

কারণ লিঙ্কটি নষ্ট হয়ে গেছে এটিই জসনফিলারঅ্যাট্রিবিউটের কোড

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

জসনকনভার্ট.ডিজারিওলাইজ অবজেক্টটি জসন.এনইটি থেকে

লিঙ্ক: জেসন.এনইটি এর সাথে জেএসএনকে সিরিয়ালাইজিং এবং ডিজিজারাইজ করছে


দুর্দান্ত দেখাচ্ছে - ব্লগ পোস্ট এবং কাস্টম এ্যাট্রিবিউট কোড লিঙ্কগুলি আর কাজ করে না - আপনি কি পুনরায় পোস্ট করতে পারবেন?
লিটল ক্রিস

4
এই সমাধানটির জন্য ক্লায়েন্ট এবং সার্ভারের দিকের পরিবর্তন দরকার। আমি জানি আপনার এটির অনেক আগে প্রয়োজন ছিল, তবে আমি পাশাপাশি একটি ভিন্ন পদ্ধতির একটি লিঙ্ক সরবরাহ করতে পারি, এটি একটি সাধারণ জিকুয়েরি প্লাগইন ব্যবহার করে যা জাভাস্ক্রিপ্ট অবজেক্টকে যে কোনও রূপে রূপান্তর করা সম্ভব করে যে ডিফল্ট মডেল বাইন্ডার বোঝে এবং মডেলটি পরামিতিগুলিতে আবদ্ধ করে। কোন ফিল্টার প্রয়োজন। erraticdev.blogspot.com/2010/12/… আপনি কীভাবে বৈধতা ত্রুটি সমাধান করেছেন তা আমি জানি না তবে এর জন্য আমার একটি সমাধানও রয়েছে: erraticdev.blogspot.com/2010/11/…
রবার্ট কোরিটনিক

4
আপনি কি জাভাস্ক্রিপ্টকনভার্টের উত্স / উত্স দিতে পারেন? ডিজরিয়ালাইজ অবজেক্ট?
ম্যাথিউউ

এটি নিউটনসফট জসন লাইব্রেরি - আপনি যদি নুগেট প্যাকেজ ম্যানেজারটি খোলে এবং নিউটনসফ্টে সন্ধান করেন তবে এটি আপনার জন্য প্রদর্শিত হবে (এখন এটি ২০১ 2016 সালের)। সম্ভবত এটি এখন সুস্পষ্ট, তবে কেউ যদি অবাক হন।
রব স্যাডলার

22

অ্যাকশন ফিল্টার, jquery স্ট্রিংফাই, bleh ...

পিটার, এই কার্যকারিতাটি এমভিসির স্থানীয়। এটি এমন একটি বিষয় যা এমভিসিটিকে এত দুর্দান্ত করে তোলে।

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

এবং কর্মে,

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

একটি যাদুমন্ত্র মত কাজ করে:

এখানে চিত্র বর্ণনা লিখুন

আপনি যদি jQuery 1.4+ ব্যবহার করেন তবে আপনি traditionalতিহ্যবাহী মোডটি সেট করে দেখতে চান:

jQuery.ajaxSettings.traditional = true;

এখানে বর্ণিত হিসাবে: http://www.dovetailsoftware.com/blogs/kmiller/archive/2010/02/24/jquery-1-4-breaks-asp-net-mvc-tives-with-array-paraters

এটি জটিল বস্তুর জন্যও কাজ করে। আপনি যদি আগ্রহী হন, আপনার মডেল বাইন্ডিং সম্পর্কে এমভিসি ডকুমেন্টেশনগুলি সন্ধান করা উচিত: http : //msdn.mic Microsoft.com/en-us/library/dd410405.aspx


4
আপনি ঠিক থাকতে পারেন, তবে জেএসওএন মডেল বাইন্ডার এমভিসি 3 এ নতুন এবং প্রশ্নটি 2008 সালে জিজ্ঞাসা করা হয়েছিল যখন এটি সমর্থন করা হয়নি। আপনার উত্তরে এটি উল্লেখযোগ্য হবে।
পাইওটার ওসিয়াক

4
জটিল বস্তুর অ্যারে পাস করার এটি কীভাবে উদাহরণ ?
ডাকমাস্ট্রে

এটি নয় তবে উদাহরণটি এখনও প্রয়োগ করে (এমভিসি 3+)। আপনার প্যারামিটারের নামগুলি যতক্ষণ মডেলটির সাথে মেলে আপনি আশা করছেন যে কোনও সমস্যা হবে না।
জে মিচেল

এখানে কীটি হ'ল পদ্ধতি প্যারামিটারের নাম ("আইডস") দিয়ে একটি জেএসওএন অবজেক্ট তৈরি করা এবং তারপরে জটিল বস্তুর অ্যারেটি রেখে দেওয়া। অতিরিক্তভাবে, তৃতীয় প্যারামিটারটি "সত্য" করুন এবং আপনি traditionalতিহ্যগত মোডের যত্ন নেবেন।
redwards510

11

ইন .NET4.5, MVC 5উইজেটের প্রয়োজন নেই।

জাভাস্ক্রিপ্ট:

জেএস মধ্যে বস্তু: এখানে চিত্র বর্ণনা লিখুন

প্রক্রিয়া যে পোস্ট করে।

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

উদ্দেশ্য প্রাপ্ত:

এখানে চিত্র বর্ণনা লিখুন

আশা করি এটি আপনার কিছুটা সময় সাশ্রয় করবে।


8

এএসপি.নেট এমভিসি ব্যবহার করে তৈরি করুন REST এপিআইয়ের দ্বিতীয়ার্ধের দিকে যা উদ্ধৃত করতে JSON এবং সরল এক্সএমএল উভয়ই বলে :

এখন আমাদের এইচটিটিপি পোস্টের মাধ্যমে বিতরণ করা জেএসএন এবং এক্সএমএল পে-লোড গ্রহণ করা দরকার। কখনও কখনও আপনার ক্লায়েন্ট ব্যাচ প্রসেসিংয়ের জন্য এক শটে অবজেক্টের সংগ্রহ আপলোড করতে চাইতে পারে। সুতরাং, তারা JSON বা XML ফর্ম্যাট ব্যবহার করে অবজেক্টগুলি আপলোড করতে পারে। এএসপি.নেট এমভিসিতে স্বয়ংক্রিয়ভাবে পোস্ট করা জেএসএন বা এক্সএমএল বিশ্লেষণ করতে এবং অ্যাকশন প্যারামিটারে স্বয়ংক্রিয়ভাবে ম্যাপ করার জন্য কোনও নেটিভ সমর্থন নেই। সুতরাং, আমি একটি ফিল্টার লিখেছিলাম যা এটি করে। "

তারপরে তিনি একটি অ্যাকশন ফিল্টার প্রয়োগ করেন যা কোড দেখানো সহ সি # অবজেক্টগুলিতে জেএসএন থেকে মানচিত্র করে।


আমি কেবল আমার আনসার লিখছিলাম। তবে আমি যাইহোক এটি পোস্ট করব ;-)
জেএসসি

7

প্রথমে এই জাভাস্ক্রিপ্ট কোডটি JSON2.js ডাউনলোড করুন , যা আমাদের অবজেক্টটিকে স্ট্রিংয়ে সিরিয়ালাইজ করতে সহায়তা করবে।

আমার উদাহরণে আমি জ্যাকগ্রিডের সারিগুলি অ্যাজাক্সের মাধ্যমে পোস্ট করছি :

    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);
    }

একটি জসনফিল্টার ক্লাস তৈরি করুন (জেএসসি রেফারেন্সকে ধন্যবাদ)

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

অন্য একটি ক্লাস তৈরি করুন যাতে ফিল্টারটি জাসন স্ট্রিংটিকে প্রকৃত ম্যানিপুলেবল অবজেক্টে পার্স করতে পারে: এই শ্রেণি কমিটেশনজেএস আমার জেকগ্রিডের সমস্ত সারি।

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

আমি আশা করি যে এই উদাহরণটি কোনও জটিল বস্তু কীভাবে পোস্ট করবেন তা চিত্রিত করতে সহায়তা করে।



-1

হে ভগবান. বিশেষ কিছু করার দরকার নেই। কেবলমাত্র আপনার পোস্ট বিভাগে নিম্নলিখিত হিসাবে করুন:

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

সার্ভারে এটি ব্যবহার করুন:

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

এই লিঙ্কটি আপনাকে করতে সহায়তা করে ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.