يفتح
يغلق

قم بتمرير البيانات باستخدام طريقة النشر بتنسيق json. سلسلة جافا سكريبت إرسال JSON إلى الخادم واستلام JSON في المقابل، بدون JQuery. وظائف PHP للعمل مع تنسيق JSON

ستتعلم من هذا الموضوع كيفية إرسال وظائف JavaScript عبر JSON باستخدام PHP (يمكن تطبيق المفهوم نفسه على لغات أخرى).

PHP منذ الإصدار 5.2.0 تتضمن وظائف json_encode() و json_decode(). تقوم هذه الوظائف بتشفير البيانات إلى JSON وفك تشفير JSON إلى صفائف ترابطية. لا يمكن ترميز الوظيفة في json_encode(). في بعض الحالات، هذا غير مريح للغاية.

  1. تمت إضافة مثال على التنفيذ في Zend Framework.
  2. سؤال لـ karmavampires - هل تعرف كيفية تمرير معالج لإنشاء كائن بشكل مختلف؟
  3. تعليق على السبب ومن يحتاج إليه.

مشكلة

// خذ مصفوفة عشوائية
$فو = صفيف(
"رقم" => 1،
"تعويم" => 1.5،
"مصفوفة" => مصفوفة (1,2)،
"سلسلة" => "شريط"،
"الوظيفة" =>
);
// الآن قم بتحويل المصفوفة إلى JSON
$json = json_encode($foo);
// أعطها للعميل
صدى $json؛

نتيجة

{
"الرقم": 1،
"تعويم": 1.5،
"مجموعة مصفوفة" :،
"سلسلة" :"شريط" ،
"وظيفة" : "function())(إرجاع \"foo bar\";)"
}

* تم تمييز كود المصدر هذا باستخدام Source Code Highlighter.

نظرًا لأنه إذا لم تقم بتضمين تعريف الوظيفة بين علامتي اقتباس، أي إذا لم تقم بتعريفها كسلسلة، فلن يتم تنفيذ التعليمات البرمجية. لذلك، من حيث المبدأ، jscon_encode() غير مناسب لتنفيذ هذه الوظيفة.

حل

  1. نذهب من خلال المصفوفة التي سيتم ترميزها.
  2. نتحقق من القيمة المشفرة لوجود تعريف الوظيفة.
  3. نتذكر القيمة ونستبدلها بتسمية فريدة.
  4. نقوم بتشفير المصفوفة المعدلة باستخدام json_encode().
  5. استبدل التسمية الفريدة بالقيمة الأصلية.
  6. نرسل JSON إلى العميل.
// المصفوفة المعالجة.
$فو = صفيف(
"الرقم" => 1،
"تعويم" => 1.5،
"مصفوفة" => مصفوفة (1,2)،
"سلسلة" => "شريط"،
"الوظيفة" => "function())(إرجاع "foo bar";)"
);

$value_arr = array();
$replace_keys = array();
foreach ($foo كـ $key => &$value )(
// التحقق من القيم لتعريف الوظيفة
إذا (strpos($value، "function(" )===0)(
// تذكر القيمة للاستبدال لاحقًا.
$value_arr = $value؛
// استبدل تعريف الدالة بتسمية "فريدة"..
قيمة $ = "%" . مفتاح $ . "%" ؛
// تذكر الملصق لاستبداله لاحقًا.
$replace_keys = """ . $value . """ ;
}
}

// تشفير المصفوفة إلى JSON
$json = json_encode($foo);

// سيبدو $json الناتج كما يلي:
{
"الرقم": 1،
"تعويم": 1.5،
"مجموعة مصفوفة" :،
"سلسلة" :"شريط" ،
"الوظيفة" :"%الوظيفة%"
}

// استبدل بالقيم الأصلية.
$json = str_replace($replace_keys, $value_arr, $json);

// أرسل إلى العميل.
صدى $json؛

// سيتلقى العميل JSON على النحو التالي:
{
"الرقم": 1،
"تعويم": 1.5،
"مجموعة مصفوفة" :،
"سلسلة" :"شريط" ،
"function" :function())(إرجاع "foo bar" ;)
}

* تم تمييز كود المصدر هذا باستخدام Source Code Highlighter.

الآن في الكائن الناتج، "function" ليست سلسلة، بل دالة. في الواقع تم حل المشكلة. إذا كنت تستخدم هذا الحل مع Prototype، فسيبدو كما يلي:
جديد Ajax.Request("json_server.php" , (
الطريقة:"احصل" ,
onSuccess: الوظيفة (النقل)(
var json = Transport.responseText.evalJSON();
تنبيه (json.function())؛ // => سيتم عرض تنبيه "foo bar".
}
});

* تم تمييز كود المصدر هذا باستخدام Source Code Highlighter.

التنفيذ في إطار عمل Zend:

$فو = صفيف(
"عدد صحيح" =>9،
"سلسلة" =>"سلسلة اختبار" ,
"الوظيفة" => Zend_Json_Expr(
"function())( window.alert("وظيفة جافا سكريبت مشفرة بواسطة Zend_Json") )"
),
);

Zend_Json::encode($foo, false , array("enableJsonExprFinder" => true ));
// سيتم إرجاع سلسلة مشفرة بصيغة json:
{
"عدد صحيح" :9،
"سلسلة" :"سلسلة اختبار" ،
"وظيفة" :وظيفة()))(
نافذة.تنبيه( "وظيفة جافا سكريبت المشفرة بواسطة Zend_Json")
}
}

* تم تمييز كود المصدر هذا باستخدام Source Code Highlighter.

لدي صفحة تسجيل للسماح للمستخدمين بالتسجيل. أحتاج إلى تأكيد رقم هاتفي قبل التسجيل. لقد أعطيت عنوان خدمة الويب مع معلماته.
المعلمات التي أعطيتها:

http://********* الطريقة: رؤوس POST: نوع المحتوى: application/json النص: ما يلي في: ( "mobileNo": "0*********"، " الخدمة: "****"، "Code1": "*****"، "المحتوى": "مرحبا"، "actionDate": "2017/09/26"، "requestId": "1")

وهذا هو الكود الذي وجدته على الإنترنت:

$data = array("mobileNo" => "****"، "service" => "***"، "Code1" => "******"، "content" => "55"، "actionDate" => "26/09/2017"); $options = array("http" => array("method" => "POST", "content" => json_encode($data), "header"=> "نوع المحتوى: application/json" . "قبول: application/json")); $url = "******"; $context =stream_context_create($options); $result = file_get_contents($url, false, $context); $response = json_decode($result);

وهنا الخطأ الذي أواجهه عندما أتحقق من وجود محلي:

File_get_contents(http://*********/sms-gateway/sms-external-zone /receive): فشل في فتح الدفق: فشلت محاولة الاتصال لأن الطرف المتصل لم يستجب بشكل صحيح بعد فترة من الوقت أو فشل الاتصال الذي تم إنشاؤه بسبب فشل المضيف المتصل في الاستجابة.

ولا يوجد خطأ ولا نتيجة (تلقي الرسائل القصيرة) في الرد عندما أقوم بالاختبار عبر الإنترنت (خادم cpanel)

بناءً على المعلمات المحددة، أين أخطأت؟

شكرا لكم مقدما.

حل

بناءً على الخطأ الذي ارتكبته، فإن خدمتك لا تستجيب. هل حاولت فتحه في المتصفح لمعرفة ما إذا كانت الإجابة موجودة؟

من الممكن أن الخدمة التي تحاول الاتصال بها تتطلب منك توفير عنوان IP ثابت من خادم الويب الخاص بك، نظرًا لأنها توفر الوصول على مستوى IP فقط. هذا يعني أن عنوان IP الخاص بك محظور حتى يسمحوا بذلك.

أقترح عليك استخدام cURL لتلبية طلبك. بهذه الطريقة يكون لديك بيانات مستقبلية لتصحيح الأخطاء إذا لم تنجح الأمور. وهنا أيضًا، إذا كانت الخدمة لا تستجيب، فأنت تريد الحصول على أي معلومات أخرى.

$data = array("mobileNo" => "****"، "service" => "***"، "Code1" => "******"، "content" => "55"، "actionDate" => "26/09/2017"); $url = "******"; $ch = curl_init($url); // تعيين البيانات كسلسلة json curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); // تعريف json كنوع محتوى cur_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type:application/json")); // أخبر الضفيرة بجلب البيانات المرجعة curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // اتبع الموقع إذا حدثت إعادة التوجيه مثل http إلى https curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // إرسال الطلب $result = curl_exec($ch); // يعطيك النتيجة - في معظم الأوقات تريد فقط هذا var_dump($result); // لغرض تصحيح الأخطاء، يمنحك معلومات الاتصال بأكملها var_dump(curl_getinfo($ch)); // يعيد أي أخطاء حدثت var_dump(curl_error($ch)); تجعيد_إغلاق($ch);

JSON هو تنسيق نصي لتسجيل البيانات.فهو يسمح لك بالتمثيل في شكل نصي لكل من رقم واحد أو سلسلة وهياكل معقدة، على سبيل المثال، المصفوفات مع البيانات. يعد استخدام تنسيق التسجيل هذا مناسبًا لأنه سهل القراءة وبديهي، بينما يسمح لك في نفس الوقت بتخزين هياكل بيانات معقدة للغاية. بالإضافة إلى ذلك، فهو أكثر إحكاما من XML، لذلك في رأيي هو الأفضل لتبادل البيانات بين متصفح الويب والخادم.

بناء جملة JSON مع الأمثلة

عادةً ما تتم كتابة تنسيق json في متغيرين:

1. تسلسل القيم. على سبيل المثال، سيبدو التسلسل 10 و15 و"الاختبار" بتنسيق JSON كما يلي:

2. التسجيل في أزواج المفتاح: القيمة . على سبيل المثال:

("الاسم الكامل": "إيفانوف سيرجي"، "تاريخ الميلاد": "1975/03/09")

مثال أكثر تعقيدًا قليلاً:

("الاسم الكامل": "إيفانوف سيرجي"، "العنوان": ("المدينة": "موسكو"، "الشارع": "بياتنيتسكايا"، "المنزل": "35"))

وظائف PHP للعمل مع تنسيق JSON

في لغة PHP منذ الإصدار 5.2. هناك 4 وظائف فقط:

  • json_decode- فك تشفير سلسلة JSON (يحصل على البيانات من سلسلة تنسيق json)
  • json_encode- إرجاع تمثيل JSON للبيانات (تحويل البيانات إلى سلسلة JSON)
  • json_last_error_msg- إرجاع سلسلة تشير إلى رسالة الخطأ الخاصة بالاستدعاء الأخير لـ json_encode() أو json_decode()
  • json_last_error- إرجاع الخطأ الأخير

في الأساس، في الغالب، يتم استخدام وظيفتين فقط: json_encodeو json_decode. لن أخوض في تفاصيل بناء الجملة، يمكنك إلقاء نظرة على php.net لمزيد من التفاصيل. مثال الاستخدام:

$arr1 = المصفوفة(0,1,2); $json_str = json_encode($arr1); صدى $json_str; // سيُخرج سلسلة json: $arr2 = json_decode($json_str); صدى $arr2; // سيتم الإخراج: 1

ملحوظة : في الترميز إلى تنسيق بيانات JSON باللغة الروسيةتقوم الدالة json_encode بتحويل الأحرف الروسية إلى يونيكود، أي. يستبدل بهم \uXXXXوبالتالي تصبح سلسلة json غير قابلة للقراءة بالنسبة للبشر (ولكنها مفهومة للمتصفح). إذا كنت تريد تجنب التحويل إلى Unicode (على سبيل المثال، عند تصحيح التعليمات البرمجية)، فيمكنك ببساطة استخدام خيار JSON_UNESCAPED_UNICODE.

وأيضًا، حتى لا تتم إضافة شرطات مائلة للتهرب أثناء التشفير وحتى يتم تشفير السلاسل ذات الأرقام كأرقام، يمكنك استخدام JSON_UNESCAPED_SLASHES وJSON_NUMERIC_CHECK. ونتيجة لذلك، لجعل سلسلة json قابلة للقراءة البشرية، سنفعل، على سبيل المثال، ما يلي:

$arr = array("fio" => "إيفانوف سيرجي"، "age" => "32"، "vk_url" => "https://vk.com/id11111"); echo json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);

بدون استخدام هذه الخيارات سيكون السطر هكذا:

( "fio" : "\u0418\u0432\u0430\u043d\u043e\u0432 \u0421\u0435\u0440\u0433\u0435\u0439"، "age" : "32"، "vk_url": "https:\/\ /vk.com\/id11111")

وباستخدام الخيارات نحصل على سطر قابل للقراءة:

( "fio" : "إيفانوف سيرجي"، "العمر" : 32، "vk_url" : "https://vk.com/id11111")

نقطة أخرى: إذا كنت بحاجة إلى الوظيفة لفك تشفير سلسلة json أعاد json_decode المصفوفة بالضبطما عليك سوى إضافة معلمة ثانية إلى الدالة التي تساوي true.

$json_str = "( "a":1, "b":2, "c":3 )"; $obj = json_decode($json_str); // الحصول على الكائن echo $obj->a; // سيُخرج 1 $arr = json_decode($json_str, true); // الحصول على مصفوفة ترابطية echo $arr["a"]; // سيتم طباعة 1

وبهذا تنتهي مراجعتي لوظائف PHP.

وظائف JavaScript للعمل مع تنسيق JSON

لنبدأ بحقيقة أن تنسيق JSON تم اختراعه في الأصل للغة JavaScript ثم أصبح مجرد تنسيق نص منفصل يستخدم في لغات مختلفة. على ما يبدو، هذا هو السبب في أن بناء جملة JSON يشبه إلى حد كبير بناء جملة كتابة الكائنات والمصفوفات العادية.

// مثال لمصفوفة في JavaScript arr = ; تنبيه(arr); // سيتم عرض 1 // مثال لكائن في JavaScript obj = ( "name": "Vasya"، "age": 35، "isAdmin": false ) تنبيه(obj.name); // سيتم طباعة "فاسيا"

وظائف JavaScript المستخدمة للتحويل من وإلى تنسيق JSON:

  • JSON.parse- فك تشفير سلسلة JSON (تحويل السلسلة إلى كائنات و/أو صفائف)
  • JSON.stringify- إرجاع تمثيل JSON للبيانات (تحويل الكائنات و/أو المصفوفات إلى سلسلة json)

مثال بسيط لفك تشفير سلسلة json إلى مصفوفة تحتوي على أرقام:

Str = ""; arr = JSON.parse(str); تنبيه(arr); // سيتم طباعة 1

مثال لتحويل (تسلسل) كائن إلى سلسلة JSON:

Obj = ( "name": "Vasya"، "age": 35، "isAdmin": false ) تنبيه(JSON.stringify(obj)); // سيتم عرض ("name": "Vasya"، "age": 35، "isAdmin": false)

عند إجراء تسلسل (تحويل) كائن إلى سلسلة JSON، يتم استدعاء الطريقة toJSONهذا الكائن إن كان موجودا. إذا لم يكن هناك أسلوب، فسيتم سرد كافة خصائص الكائن. مثال لتحويل كائن باستخدام طريقة toJSON:

Obj = ( "name": "Vasya"، "age": 35، "isAdmin": false، toJSON: function() ( return this.age; ) ) تنبيه(JSON.stringify(obj)); // سيتم طباعة 35

أمثلة على التطبيق العملي لتنسيق JSON

في الواقع، أنا شخصيًا أستخدم تنسيق JSON في حالتين رئيسيتين:

1. نقل البيانات بين المتصفح والخادم باستخدام طلبات Ajax.

على سبيل المثال، لدينا بعض الصفحات التي نحتاج إلى تحديث البيانات فيها دون إعادة تحميل الصفحة. لنفترض أنك بحاجة إلى "تنزيل" معلومات تتضمن قائمة الموظفين وبياناتهم من الخادم.

في JavaScript، وباستخدام jQuery، نبسط الأمر ونعرض البيانات على شكل جدول في المتصفح:

$.getJSON("get-info.php").success(function(data) ( // طلب ajax، ستتم كتابة البيانات من الخادم إلى متغير البيانات htmlstr = "

"؛ لـ (var i=0; i "; // العمود الأول - الاسم الكامل htmlstr += " "; // العمود الثاني - تاريخ الميلاد htmlstr += ""; ) htmlstr = "
" + البيانات[i].عيد الميلاد + "
"; $("div.info").html(htmlstr); // في div مع فئة المعلومات نعرض الجدول الناتج مع البيانات ));

على الخادم، يمكن أن يكون البرنامج النصي get-info.php الذي يتم إرسال طلب ajax إليه، على سبيل المثال، كما يلي:

$user_info = array(); // إنشاء مصفوفة تحتوي على البيانات $user_info = array ("fio" => "Ivanov Sergey"، "birthday" => "03/09/1975"); $user_info = array ("fio" => "أليكسي بتروف"، "عيد ميلاد" => "18/09/1983"); صدى json_encode($user_info); مخرج؛

في هذا المثال، كانت سلسلة JSON التي تم تمريرها من الخادم إلى المتصفح كما يلي:

[("fio": "سيرجي إيفانوف"، "عيد الميلاد": "09/03/1975")،("fio": "أليكسي بيتروف"، "عيد الميلاد": "18/09/1983")]

لقد تعمدت عدم إظهار الخط على شكل "شجرة" لأن يتم نقله بالضبط في هذا النموذج. وكيف يمكنك التقييم، تبين أن تسجيل البيانات بتنسيق JSON مضغوط للغايةمما يعني أن نقل هذه البيانات من الخادم إلى المتصفح سيكون فوريًا تقريبًا.

2. كتابة هياكل البيانات المعقدة لقاعدة البيانات.

في بعض الأحيان توجد مواقف لا يُنصح فيها بإنشاء جدول آخر في قاعدة البيانات لتخزين البيانات المختلفة. لنفترض أن المستخدم المسجل في الموقع لديه الفرصة لتخصيص لون الخلفية ولون النص.

بدلاً من إنشاء جدول آخر لإعدادين، يمكنك ببساطة إنشاء عمود نصي في الجدول يحتوي على قائمة المستخدمين التي تريد وضع بيانات إعدادات المستخدم فيها. ومن ثم يمكن أن يكون طلب تحديث الإعدادات، على سبيل المثال، على النحو التالي:

تحديث إعدادات المستخدمين = "("background-color": "#FFFFFF"، "text-color": "#000000")" حيث user_id = 10

في المستقبل، بعد الحصول عليها من الجدول المستخدمينالمعلومات، يمكن لبرنامج PHP النصي تحويلها بسهولة إلى مصفوفة باستخدام الإعدادات. على سبيل المثال، إذا كان المتغير $user_info يحتوي على بيانات تم الحصول عليها لمستخدم من جدول المستخدمين، فإن الحصول على مصفوفة مع الإعدادات أمر بسيط للغاية:

$settings = json_decode($user_info["settings"], true); صدى "لون الخلفية = ".$settings["background-color"]; صدى "لون النص = ".$settings["text-color"];

في تنسيق JSON، يمكنك أيضًا، على سبيل المثال، تسجيل خيارات المنتج التي حددها المشتري في قاعدة البيانات.

("15":["45"، "47"]، "18": "52") // الخيار 15 له القيمتان 45 و 47 محددتان، والخيار 18 له القيمة 52 محددة

من حيث المبدأ، يمكنك أيضًا كتابة محتويات سلة التسوق بالكامل بتنسيق JSON، على سبيل المثال، على النحو التالي:

( "user_id" : 10، "session_id" : "2c2l3h4ii271aojentejtdcmh3"، "products": [ ( "product_id" : 15، "options" : ( "15" : ، "18" : 52)، "quantity" : 1، "السعر" : 1500 ), ( "معرف_المنتج" : 16, "الخيارات" : ( "15" : , "18" : 51 ), "الكمية" : 2, "السعر" : 1000 ) ] )

في شكلها المعتاد غير الشجري، ستكون سلسلة JSON هذه كما يلي:

("user_id":10، "session_id": "2c2l3h4ii271aojentejtdcmh3"، "المنتجات":[("product_id":15، "options":("15":،"18":52)،،"quantity":1 , "price":1500),("product_id":16,options":("15":,18":51),,"quantity":2,price":1000)])

وبالتالي، كما يتبين من الأمثلة، يمكن تخزين أي معلومات تقريبًا ونقلها بتنسيق JSON.

لقد حصلت على الكثير من المعلومات هنا لذا أردت نشر الحل الذي اكتشفته.

مشكلة:استلام بيانات JSON من Javascript في المتصفح وعلى الخادم واستخدام PHP لتحليلها بنجاح.

الأربعاء:جافا سكريبت في متصفح (فايرفوكس) على نظام التشغيل Windows. خادم LAMP كخادم بعيد: PHP 5.3.2 على Ubuntu.

ما الذي يعمل (الإصدار 1):
1) JSON هو مجرد نص. نص بتنسيق محدد، ولكن سلسلة نصية فقط.

2) في Javascript، var str_json = JSON.stringify(myObject) يعطيني سلسلة JSON.

3) أستخدم كائن AJAX XMLHttpRequest في Javascript لإرسال البيانات إلى الخادم:
طلب = XMLHttpRequest () جديد
request.open("POST"، "JSON_Handler.php"، صحيح)
request.setRequestHeader("نوع المحتوى"، "application/json")
طلب.إرسال (str_json)
[...كود لعرض الاستجابة...]

4) على كود PHP الخاص بالخادم لقراءة سلسلة JSON:
$str_json = file_get_contents("php://input");
هذا يقرأ بيانات POST الأولية. يحتوي $str_json الآن على سلسلة JSON الدقيقة من المتصفح.

ما الذي يعمل (الإصدار 2):
1) إذا كنت أرغب في استخدام رأس الطلب "application/x-www-form-urlencoded"، فأنا بحاجة إلى إنشاء سلسلة POST قياسية "x=y&a=b" بحيث عندما يستقبلها PHP، يمكن وضعها في المجلد $_POST مصفوفة ترابطية. لذلك، في جافا سكريبت في المتصفح:

var str_json = "json_string=" + (JSON.stringify(myObject))

الآن سيتمكن PHP من ملء المصفوفة $_POST عندما أقوم بإرسال str_json عبر AJAX/XMLHttpRequest كما في الإصدار 1 أعلاه.

سيؤدي عرض محتويات $_POST["json_string"] إلى عرض سلسلة JSON. سيؤدي استخدام json_decode() على عنصر صفيف $_POST مع سلسلة json إلى فك تشفير تلك البيانات بشكل صحيح ووضعها في صفيف/كائن.

المأزق الذي واجهته:
حاولت في البداية إرسال سلسلة JSON برأس التطبيق /x -www-form-urlencoded ثم حاولت قراءتها على الفور من المصفوفة $_POST في PHP. كانت المصفوفة $_POST فارغة دائمًا. وذلك لأنه يتوقع بيانات بالصيغة yval = xval & . لم يعثر على مثل هذه البيانات، بل مجرد سلسلة JSON، وقد تخلص منها. لقد نظرت إلى رؤوس الطلب وتم إرسال بيانات POST بشكل صحيح.

وبالمثل، إذا استخدمت رأس application/json، فلن أتمكن مرة أخرى من الوصول إلى البيانات المرسلة عبر المصفوفة $_POST. إذا كنت تريد استخدام رأس محتوى التطبيق/json، فيجب عليك الوصول إلى بيانات POST الأولية في PHP عبر إدخال php:// بدلاً من $_POST.

الأدب:
1) كيفية الوصول إلى بيانات POST في PHP: كيفية الوصول إلى بيانات POST في PHP؟
2) تفاصيل نوع التطبيق/json مع بعض أمثلة الكائنات التي يمكن تحويلها إلى سلاسل JSON وإرسالها إلى الخادم:

كيفية إرسال قائمة الكائنات (قائمة) إلى Ajax بتنسيق JSON

مثال 1

$(document).ready(function () ( $("body").on("click"، "button"، function () ( var Product = JSON.stringify(( "Name": $("textarea") .val(), "Cost": $("input").val(), )); console.log(product $.ajax(( url: "/Products/AjaxCreate/"، الطريقة: "POST")؛ ، نوع المحتوى: "application/json"، البيانات: المنتج، النجاح: الوظيفة (الاستجابة) (console.log(response); ) ));

مراقب

Public ActionResult AjaxCreate(منتج المنتج)( return Json(new ( result = "success"), JsonRequestBehavior.AllowGet); )

مثال 2

//حفظ الفاتورة$("body").on("انقر"، "زر"، الوظيفة () ( // قم بتجميع الجدول كمصفوفة من الكائناتفار فاتورة التفاصيل = ; $(".item").each(function () ( var name = $(this).find(".name").val(); //الاسم varquity = parseInt($(this).find(" .quantity").val()); //الكمية var السعر = parseFloat($(this).find(".price").val());//السعر var summ = parseFloat($(this).find (".item-summ").attr("value"));//Sum var ProductId = parseFloat($(this).find(".item-id").attr("value"));// معرف المنتج var ProductSkuId = parseInt($(this).find(".item-sku-id").attr("value")); // معرف العرض التجاري للمنتج var notRec = $(this).find(".item-not-rec").prop("checked"); // خذ المنتج بعين الاعتبار أم لا billDetails.push((الاسم: الاسم، الكمية: الكمية، السعر: السعر، المجموع: المجموع، معرف المنتج: معرف المنتج، معرف المنتج: ProductSkuId، NotRec: notRec )); )); console.log(billDetails); billDetails = JSON.stringify(( "billDetails": billDetails )); // اتحول إلى ستاثام // أرسل للحفظ$.ajax(( url: "/Bills/AjaxSaveInvoiceBill/"، الطريقة: "POST"، نوع المحتوى: "application/json"، البيانات: تفاصيل الفاتورة، النجاح: الوظيفة (الاستجابة) ( window.location.replace("/Bills/ قائمة/")؛ ) ))؛ عودة كاذبة؛ ));

مراقب

نتيجة الإجراء العام AjaxSaveInvoiceBill(List billDetails)( if (billDetails.Count == 0) return Json(new ( result = "error", message = "لا توجد بضائع في الفاتورة"), JsonRequestBehavior.AllowGet); // أنشئ فاتورة جديدة واحصل على معرفها long billId = Bill.CreateBill(BillTypes.Invoice); // الآن دعونا نحفظ كل موقف تحت معرف الفاتورة الجديدة BillDetail.SaveBillDetails(billDetails, billId); return Json(new ( result="success", message="تم إنشاء الفاتورة بنجاح" ), JsonRequestBehavior.AllowGet); )

طلب Ajax للتحكم وتلقي استجابة Json

$(document).ready(function () ( $.ajax(( url: "/Suppliers/AjaxGetSuppliersList/"، الطريقة: "GET"، النجاح: الوظيفة (الاستجابة) ( data = JSON.stringify(response.suppliers); var list = eval("(" + data + ")"); اقتراح_عدد = list. length if (suggest_count > 0) ( $(".supplier-select").empty(); // امسح قائمة العناصر // أضف قائمة العناصر الناتجة إلى التحديد$.each(response.suppliers، الوظيفة (المفتاح، القيمة) ( $(".supplier-select").append(" "); }); } } }); });

مراقب

Public ActionResult AjaxGetSuppliersList() ( قائمة الموردين = المورد.GetSuppliers(); return Json(new (موردون), JsonRequestBehavior.AllowGet);)