পোস্টের মাধ্যমে জেএসএন ডেটা প্রেরণ করুন (এজ্যাক্স) এবং কন্ট্রোলার (এমভিসি) এর জেসন প্রতিক্রিয়া পান


139

আমি জাভাস্ক্রিপ্টে এর মতো একটি ফাংশন তৈরি করেছি:

function addNewManufacturer() {
       var name = $("#id-manuf-name").val();
       var address = $("#id-manuf-address").val();
       var phone = $("#id-manuf-phone").val();

       var sendInfo = {
           Name: name,
           Address: address,
           Phone: phone
       };

       $.ajax({
           type: "POST",
           url: "/Home/Add",
           dataType: "json",
           success: function (msg) {
               if (msg) {
                   alert("Somebody" + name + " was added in list !");
                   location.reload(true);
               } else {
                   alert("Cannot add to list !");
               }
           },

           data: sendInfo
       });
}

আমি jquery.json-2.3.min.jsস্ক্রিপ্ট ফাইল বলেছি এবং আমি এটি toJSON(array)পদ্ধতির জন্য ব্যবহার করেছি ।

নিয়ামক হিসাবে, আমার এই Addক্রিয়া আছে

[HttpPost]
public ActionResult Add(PersonSheets sendInfo) {
    bool success = _addSomethingInList.AddNewSomething( sendInfo );

    return this.Json( new {
         msg = success
    });

}

কিন্তু sendInfoপদ্ধতি হিসাবে পরামিতি নাল হয়ে যায়।

মডেলটি:

public struct PersonSheets
{
    public int Id;
    public string Name;
    public string Address;
    public string Phone;
}

public class PersonModel
{
    private List<PersonSheets> _list;
    public PersonModel() {
         _list= GetFakeData();
    }

    public bool AddNewSomething(PersonSheets info) {
         if ( (info as object) == null ) {
            throw new ArgumentException( "Person list cannot be empty", "info" );
         }

         PersonSheets item= new PersonSheets();
         item.Id = GetMaximumIdValueFromList( _list) + 1;
         item.Name = info.Name;
         item.Address = info.Address;
         item.Phone = info.Phone;

         _list.Add(item);

         return true;
    }
}

পোষ্টের সাথে ডেটা প্রেরণ করা হলে আমি কীভাবে অ্যাকশন পদ্ধতিতে পারি?

আমি কিভাবে ব্যবহার করতে জানি না। এছাড়াও, জেএসএন এর মাধ্যমে প্রতিক্রিয়াটি (এজ্যাক্সে) ফেরত পাঠানো সম্ভব?


2
হাই স্নেক আইস আপনি দয়া করে নেহার উত্তরের গৃহীত উত্তরটি পরিবর্তন করতে পারেন? প্রবীণ প্রসাদের উত্তরটি বর্তমানে ভেঙে গেছে কারণ এটি (লেখার সময়) জেএসএনকে এনকোড করতে ব্যর্থ হয়েছে এবং জেএসএন কনটেন্ট-টাইপ শিরোনাম সেট করতে ব্যর্থ হয়েছে। নেহার এই দুটিই সঠিকভাবে করেছে। আমি উভয় উত্তর পরীক্ষা করেছি।
নাল

উত্তর:


120

একটি মডেল তৈরি করুন

public class Person
{
    public string Name { get; set; }
    public string Address { get; set; }
    public string Phone { get; set; }
}

নিয়ন্ত্রণকারীরা নীচের মত

    public ActionResult PersonTest()
    {
        return View();
    }

    [HttpPost]
    public ActionResult PersonSubmit(Vh.Web.Models.Person person)
    {
        System.Threading.Thread.Sleep(2000);  /*simulating slow connection*/

        /*Do something with object person*/


        return Json(new {msg="Successfully added "+person.Name });
    }

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

<script type="text/javascript">
    function send() {
        var person = {
            name: $("#id-name").val(),
            address:$("#id-address").val(),
            phone:$("#id-phone").val()
        }

        $('#target').html('sending..');

        $.ajax({
            url: '/test/PersonSubmit',
            type: 'post',
            dataType: 'json',
            contentType: 'application/json',
            success: function (data) {
                $('#target').html(data.msg);
            },
            data: JSON.stringify(person)
        });
    }
</script>

141
var SendInfo= { SendInfo: [... your elements ...]};

        $.ajax({
            type: 'post',
            url: 'Your-URI',
            data: JSON.stringify(SendInfo),
            contentType: "application/json; charset=utf-8",
            traditional: true,
            success: function (data) {
                ...
            }
        });

এবং কর্মে

public ActionResult AddDomain(IEnumerable<PersonSheets> SendInfo){
...

আপনি আপনার অ্যারে এভাবে বাঁধতে পারেন

var SendInfo = [];

$(this).parents('table').find('input:checked').each(function () {
    var domain = {
        name: $("#id-manuf-name").val(),
        address: $("#id-manuf-address").val(),
        phone: $("#id-manuf-phone").val(),
    }

    SendInfo.push(domain);
});

আশা করি এটি আপনাকে সাহায্য করতে পারে


এটি কি তাই নয় যে মডেলটির স্ট্রিংফাইজিং করা কিছু সুরক্ষা উদ্বেগকে বাড়িয়ে তুলেছে যেহেতু ডেটা টেম্পার করতে পারে এবং কিছু এক্সএসএস দুর্বলতা ?োকাতে পারে?
ডেভ

@ ডেভ নং, একটি এন্ডপয়েন্ট (এই ক্ষেত্রে কোনও এমভিসি কন্ট্রোলার ফাংশন) কোনও ক্লায়েন্টকে বিশ্বাস না করা উচিত, তাই এক্সএসএস চেকটি সার্ভারে করা উচিত। নিয়ামক সঠিক উপায়ে ডেটা পার্স করার জন্য দায়বদ্ধ এবং ডেটারটিকে কলারের কাছে (ওয়েব অ্যাপ) প্রেরণ করুন।
কলারও ফিডলার

6
এফওয়াইআই, অ্যাপ্লিকেশন / জেসন সহ একটি অক্ষর পাঠানো অবৈধ। চরসেটটি শুধুমাত্র পাঠ্য / * প্রকারের ক্ষেত্রে প্রযোজ্য। অ্যাপ্লিকেশন / জসন হ'ল সর্বদা ইউটিএফ -8, কোনও শিরোনাম নির্বিশেষে।
ধনী রিমার

আমি যখন অনুরোধে কন্টেন্ট টাইপের সাথে ডেটা টাইপ প্রতিস্থাপন করি তখন এটি কাজ করে।
হুয়াংলি

3
আমার সমস্যাটি JSON.stringify () ব্যবহার করে সমাধান করা হয়েছে, কেউ জসন অবজেক্ট প্রেরণ করার সময় আমাদের কেন এটি প্রয়োজন তা একটু ব্যাখ্যা করতে পারেন?
মুহাম্মদ জেশান গাফুর

13

ব্যবহার JSON.stringify(<data>)

আপনার কোড পরিবর্তন করুন: data: sendInfoথেকে data: JSON.stringify(sendInfo)। আশা করি এটি আপনাকে সহায়তা করতে পারে।


1
আপনার কনটেন্টটাইপটি পাশাপাশি 'অ্যাপ্লিকেশন / জেসন' এ সেট করতে হবে। কিছু শেষবিন্দু অনুমান করতে পারে তবে তাদের বলা এটি জেএসএন আরও নির্ভরযোগ্য।
নাল

2

জেএসএন পোস্ট করার জন্য আপনাকে এটি স্ট্রিংফাই করতে হবে। JSON.stringifyএবং মিথ্যাতে processDataবিকল্প সেট করুন ।

$.ajax({
    url: url,
    type: "POST",
    data: JSON.stringify(data),
    processData: false,
    contentType: "application/json; charset=UTF-8",
    complete: callback
});

0

আপনার পার্সনশিটের একটি সম্পত্তি আছে int Id, Idপোস্টে নেই, তাই মডেলবাইন্ডিং ব্যর্থ। আইডিটিকে naclable (int?) করুন বা পোষ্ট দিয়ে কমপক্ষে আইডি = 0 প্রেরণ করুন।


-2

আপনাকে কল করে $.toJSONযোগ করার দরকার নেইtraditional = true

data: { sendInfo: array },
traditional: true

করতে হবে.


কোন ভাল পছন্দ! আমি যদি আপনার কোডটি অনুসরণ করি তবে পদ্ধতিটির প্যারামিটারটি Add(object[] sendInfo)বাতিল হয়ে যাবে!
সাপ চোখ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.