كيفية استدعاء Web API باستخدام JQuery - عرض البيانات والحذف
-
استدعاء Web API عن طريق jQuery
تعلمنا سابقا كيف نستدعي Web API عن طريق .Net Core وكيف ممكن نستقبل البيانات ونتعامل معها. جميل بالإضافة لهاذي الطريقة في كمان اكثر من طريقة ممكن نستخدمها حتي نستدعي Web API ومنها عن طريق jQuery الي هو موضوعنا اليوم .
طيب جاهزين ..... يلا نبدأ
نرجع لمشروعنا السابق Web API الي كان باسم MyFirstAPIPRoject ومثل ما تعلمنا انشانا Controller باسم Courses اكيد ما نسيت، عملنا action داخل هذا controller باسم GetAllCourses حتي نرجع المواد الموجوده .
تمام الان صار وقت نتعلم كيف ممكن نستدعي هذا API عن طريق jQuery
ملاحظة : jQuery ممكن نستخدمها مع ملفات HTML او ملفات cshtml الي هي View
الان نتعلم كيف ممكن نستدعي API في ملفات HTML .
نرجع لمشروع StudentPortal، وخلونا حتي يكون الشغل منظم وواضح نعمل Folder باسم HTMLJQuery في المشروع والملفات الي حنشتغل عليها تكون في هذا الملف .

ملاحظة: اكيد في المشاريع الحقيقية مش محتاج تعمل هذا folder لان المفروض التنظيم يكون حسب طريقتك وحسب مشروعك.
تمام بعد ما عملنا Folder خلونا نعمل ملف HTML ونسميه AllCourses وطريقة الإضافة نفس الطرق السابقة انقر يمين فوق folder وبعدها اختار add new item وبعدها نبحث عن HTML

طيب بعد الإضافة بكون شكل المشروع:

تمام الان دور نعمل تصميم بسيط في صفحة HTML لعرض المواد تماما مثل View الي عملناها سابقا(اكيد ما نسيت).
خلونا نضيف الكود التالي الى صفحة HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<table class="table table-sm table-striped table-bordered m-2">
<thead>
<tr>
<th>Course ID</th>
<th>CourseNumber</th>
<th>CourseName</th>
<th>CourseDescription</th>
<th>Price</th>
<th>Capacity</th>
<th>Update</th>
<th>Delete</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</body>
</html>
الكود السابق كود HTML عادي عبارة عن جدول في أعمدة بحقول Courses
لاحظ أنو tbody فارغً. والسبب لإنو نستخدمو لعرض البيانات الراجعة من API باستخدام jQuery.
ملاحظة: ممكن نستخدم Div بدل tbody ونرجع البيانات فيه.
تمام صفحة HTML جاهزة، الان وقت نشوف كيف ممكن نستخدم jQuery AJAX وحتي نفهم الموضوع خلونا نزيد الكود التالي الى الصفحة:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> <table class="table table-sm table-striped table-bordered m-2"> <thead> <tr> <th>Course ID</th> <th>CourseNumber</th> <th>CourseName</th> <th>CourseDescription</th> <th>Price</th> <th>Capacity</th> <th>Update</th> <th>Delete</th> </tr> </thead> <tbody> </tbody> </table> </body> </html> <script type="text/javascript"> $(document).ready(function () { ShowAllCourses(); function ShowAllCourses() { $("table tbody").html(""); $.ajax({ type: "GET", url: "https://localhost:7081/api/Course/GetAllCourses", data: "{}", contentType: "application/json; charset=utf-8", dataType: "json", //crossDomain: true, success: function (result, status, xhr) { $.each(result, function (index, value) { $("tbody").append($("<tr>")); appendElement = $("tbody tr").last(); appendElement.append($("<td>").html(value["coursesId"])); appendElement.append($("<td>").html(value["courseNumber"])); appendElement.append($("<td>").html(value["courseName"])); appendElement.append($("<td>").html(value["courseDescription"])); appendElement.append($("<td>").html(value["price"])); appendElement.append($("<td>").html(value["capacity"])); appendElement.append($("<td>").html("<a href=\"UpdateReservation.html?id=" + value["id"] + "\"><img src=\"/icon/edit.png\" /></a>")); appendElement.append($("<td>").html("<img class=\"delete\" src=\"/icon/delete.jpg\" />")); }); }, error: function (jqXHR, textStatus, errorThrown) { if (jqXHR.status == 500) { alert(Internal error: + jqXHR.responseText); } else { alert(Unexpected error. + jqXHR.responseText); } } }); } $("table").on("click", "img.delete", function () { var CourseId = $(this).parents("tr").find("td:nth-child(1)").text(); $.ajax({ type: "delete", url: "https://localhost:7081/api/Course/DeleteCourse?id="+CourseId, data: "{}", contentType: "application/json; charset=utf-8", dataType: "json", success: function (result, status, xhr) { ShowAllCourses(); }, error: function (xhr, status, error) { console.log(xhr) } }); }); }); </script>
شرح الكود السابق:
الكود :
$(document).ready(function ()
هذا الكود بتفعل لما الصفحة تشتغل ومن خلالو استدعينا Function JavaScript باسم ShowAllCourses لعرض جميع المواد داخل هذا function
استخدمنا jQuery.ajax() والي بتعمل على استدعاء API عن طريق تحددي URL ل API
لاحظ كمان ان استخدمنا type: "get", لان المطلوب الان ارجاع المواد.
وبعدها حددنا contentType من نوع "application/json"
في حال نجاح العميلة النتائج بترجع في المتغير result وبعدها عملنا $.each لقراءة جميع البيانات في result مع تحديد index و value ومن ثم عملنا appendElement للعناصر في tbody
واضفنا بعدا <a href> </a> بهدف إضافة اختيارات للحذف والتعديل
اما في حال حدوث خطأ بنستخدم الكود console.log(xhr) لطباعة الخطأ
تمام نجرب نشغل التطبيق ونشوف النتيجة.
لتشغيل الصفحة في اكثر من طريقة :
⦁ ممكن نقر مرتين على الصفحة من مكان تخزينها
⦁ انقر يمين في الصفحة واختار

شغل الصفحة ونشوف النتيجة
ملاحظة: ما تنسي تشغل تطبيق Web API
عند تشغيل التطبيق ستلاحظ مشكلة CORS (شوف الصورة)

تمام وحتي نحل المشكلة شوف الدرس الخالص بتمكين CORS
حلو بعد ما نعمل تمكين ل CORS نرجع نشغل التطبيق وبتكون النتيجة:

لاحظ ان شكل الصفحة بدون تصميم بسبب ان ما اضفنا ملفات CSS .
طبعا ممكن نفس الى عملنا نطبقو على View داخل هذا المشروع، وحتي نعمل هاذ الاشي خلونا نعمل Action داخل CourseController باسم GetAllcourse والكود الخاص فيه بكون :
public ViewResult GetAllcourse() => View();
بعدها نعمل View بالنقر يمين فوق Action وبنختار Add New View
تمام داخل هذا View نضيف الكود التالي :
@{
ViewData["Title"] = "GetAllcourses";
}
<table class="table table-sm table-striped table-bordered m-2">
<thead>
<tr>
<th>Course ID</th>
<th>CourseNumber</th>
<th>CourseName</th>
<th>CourseDescription</th>
<th>Price</th>
<th>Capacity</th>
<th>Update</th>
<th>Delete</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<script src="/lib/jquery/jquery.js"></script>
<script src="/lib/jquery/jquery.min.js"></script>
<script src="/lib/jquery/jquery.js"></script>
<script type="text/javascript">
$(document).ready(function () {
ShowAllCourses();
function ShowAllCourses() {
$("table tbody").html("");
$.ajax({
type: "GET",
url: "https://localhost:7081/api/Course/GetAllCourses",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
//crossDomain: true,
success: function (result, status, xhr) {
$.each(result, function (index, value) {
$("tbody").append($("<tr>"));
appendElement = $("tbody tr").last();
appendElement.append($("<td>").html(value["coursesId"]));
appendElement.append($("<td>").html(value["courseNumber"]));
appendElement.append($("<td>").html(value["courseName"]));
appendElement.append($("<td>").html(value["courseDescription"]));
appendElement.append($("<td>").html(value["price"]));
appendElement.append($("<td>").html(value["capacity"]));
appendElement.append($("<td>").html("<a href=\"UpdateReservation.html?id=" + value["id"] + "\"><img src=\"/icon/edit.png\" /></a>"));
appendElement.append($("<td>").html("<img class=\"delete\" src=\"/icon/delete.jpg\" />"));
});
},
error: function (jqXHR, textStatus, errorThrown) {
if (jqXHR.status == 500) {
alert(Internal error: + jqXHR.responseText);
} else {
alert(Unexpected error. + jqXHR.responseText);
}
}
});
}
$("table").on("click", "img.delete", function () {
var CourseId = $(this).parents("tr").find("td:nth-child(1)").text();
$.ajax({
type: "delete",
url: "https://localhost:7081/api/Course/DeleteCourse?id="+CourseId,
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (result, status, xhr) {
ShowAllCourses();
},
error: function (xhr, status, error) {
console.log(xhr)
}
});
});
});
</script>
تمام الان دور نشغل هذا View ، شغل التطبيق وادخل الرابط التالي :
https://localhost:7242/Course/GetAllcourse
بتكون النتيجة:

تمام التمام
الان نشوف Delete
طريقة الاستدعاء نفس الطريقة السابقة باستثناء تغيير اسم Action وارسال رقم Course المطلوب نحذفه.
طبعا لأغراض تعليمة في هذه المقال نرسل رقم Course بهاذ الشكل ، في التطبيقات والمواقع الحقيقية المفروض يكون في نوع من الحماية، حتي ما يعرف المستخدم ارقام المواد ويعمل اعمال تخريبية.(ممكن تستخدم التشفير للأرقام وفي درس مستقل بخصوص ذلك مستقبلا ).
طيب في كود الحذف استدعينا action باسم DeleteCourse وبعثنا parameter باسم CourseId .
نرجع للمشروع MyFirstAPIProject وخلونا نعمل تعديل على action الخاص بالحذف (نضيف الكود التالي):
[HttpDelete]
[Route("DeleteCourse")]
public async Task<int> DeleteCoursesModel(int id)
{
connection = new SqlConnection(configuration.GetConnectionString("STDCS"));
int Result = 0;
try
{
string sqlQuery = "update courses set status=0 where CoursesId="+ id;
DbProviderFactory dbFactory = DbProviderFactories.GetFactory(connection);
using (var cmd = dbFactory.CreateCommand())
{
cmd.Connection = connection;
cmd.CommandType = CommandType.Text;
cmd.CommandText = sqlQuery;
connection.Open();
await Task.Run(() => cmd.ExecuteNonQuery());
connection.Close();
Result = 1;
}
}
catch (Exception ex)
{
Result = 0;
}
finally
{
}
return Result;
}
لاحظ ان في هذا الكود عملنا update وما عملنا Delete الهدف من ذلك هو الاحتفاظ بجميع السجلات في قاعدة البيانات(ممكن ترجع الها باي وقت). الفكرة ان بنعرض البيانات حسب الحالة اذا كانت 0 ما بتعرضها واذا كانت 1 بنعرضها).
تمام.
خلونا نحاول نجرب الحذف ونشوف النتيجة.
الصورة التالية شكل قاعدة البيانات قبل الحذف(لاحظ ان جميع السجلات الحالة الها 1)

والصورة التالية كمان شكل View

بعد الحذف بكون شكل قاعدة البيانات(لاحظ ان الكورس رقم 8 تغير الى 0 )

وشكل View بكون :

طيب نرجع الخاص باستدعاء Delete API ونحاول نفهم المكتوب:
$("table").on("click", "img.delete", function () {
var CourseId = $(this).parents("tr").find("td:nth-child(1)").text();
$.ajax({
type: "delete",
url: "https://localhost:7081/api/Course/DeleteCourse?id="+CourseId,
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (result, status, xhr) {
ShowAllCourses();
},
error: function (xhr, status, error) {
console.log(xhr)
}
});
});
فاستخدمنا jQuery .on() method ل اimg tag الي الها class باسم delete بعدها رجعنا رقم Course من اول td الي عملنا الو Fill لما استدعينا GetAllCourses ارجع للكود وبتشوف ان اول td خاص برقم course وهيك بنكون حصلنا رقم الكورس، الكود الخاص بذلك هو :
var CourseId = $(this).parents("tr").find("td:nth-child(1)").text();
بعدها استدعينا DeleteCourse وعند نجاح العملية استدعينا ShowAllCourses(); حتي نرجع نعرض الكورسات بعد الحذف.
ملاحظة : الحذف عادتا بكون بعد رسالة تأكيد يعني الصح نرجع للمستخدم رسالة تأكيد ان يريد الحذف او لا.
بنطلب منك تحاول تطبيق رسالة الحذف واذا ما عرفت راسلنا وبنبعثلك الكود.
اترك تعليقك