الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الجزء الثالث : الإتصال بدوال Server-Side من خلال Client-Side

بدأه Ahmed Moosa في 20 نوفمبر 2010 · 7 رد · 1,572 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

الجزء الثالث

Calling HttpHandler using Jquery.get () function

تذكير : من الدرس الأول والثانى تتضح الكثير من المفاهيم ولى أين نتجه وماذا أنهينا وماذا تبقى فيرجى العودة للمزيد .

مقدمة :

تتمتع Jquery بطريقة عمل خاصة مع Server وكذلك قواعد البيانات بأنواعها من خلال دوال Ajax .مثال get ,Ajax,Post,Load,getjson,getscript

ما ستعرفه فى درس اليوم :

- العمل مع HttpHandler وإسترجاع بيانات منه .

- كيفية الحصول على كود Html لأى أداة أثناء وقت التشغيل من خلال العمل مع دالة RenderControl .

-نقل اداة من ملف لملف آخر .

- المزيد من Linq

- الخوض قليلا فى Jquery .

أدوات درس اليوم :

- HttpHandler

- Linq to Sql

- Jquery

- C#

ونبدأ بالدالة الأولى وهى : get()

وظيفتها : الإتيان ببيانات من الخادم بإستخدام HTTP Get Request .وتعود ببيانات من نوع XMLHttpRequest .

ولك أن تعلم أنها حين تستخدم مع الصفحة من نوع aspx فإنها تعود بكامل محتويات الصفحة وكذلك ما يوجد فى حدث page load فقط . مما قد يدخل بيانات لا حاجة فيها .والإستخدام الأمثل لها هو إستخدامها مع HttpHandler .

ومثال مبسط لها كما يلى :

$.get(url);

بالطبع هى تعود بالناتج ولكن أين تضعه ؟ ليس فى أى مكان . وإنما نحتاج ان نستقبل الناتج هكذا :

$.get(url,function(result){
alert(result);
});

وبالطبع إن وجد هناك Parameters فإنها تكتب على هذا النحو :

$.get ( url , { param1 : value1 }, function(result){
alert(result);
});

تمرين :

ما ر أيك أن ننفذ التمرين السابق بإستخدام دالة get ولكن هذة المرة سنرى أشياء جديدة سنقوم بنقل GridView من HttpHandler إلى صفحة aspx وذلك من خلال هذة الدالة ولا حظ أن هذة GridView ستكون ممتلئه بالبيانات .

النتائج النهائية التى نريد الحصول عليها :

post-223130-046158400 1290284526_thumb.p

لاحظ انه عند إختيار أحد عناصر القائمة سيتم عرض التفاصيل فى اداةGridView التى أمامك .

الجيد فى هذا الأمر أنه عند عرض مصدر الكود View Source فلن تجد فى الأصل أى محتويات ستجد الصفحة ليس بها GridView ولكن ستجد بها DropDownList ولكن فارغة وكذلك التنسقيات ليس لها أثر إلا فى ملف CSS . أما عن أكواد HTML الخاصة بأداتى DropDownlist و GridView فيتم الإتيان بهم من HttpHandler وإدراجهم للعرض فى الصفحة كما ترى أما عن حدث التحكم فى عرض التفاصيل عند إختيار أحد عناصر القائمة تمت معالجته بـ Jquery وكذلك تم حجز مكان فقط لأداة GridView بإستخدام Div ليشير فقط إلى مكان وضع هذة الأداة .

العمل فى خطوات : -

قم بإنشاء صفحة aspx وضع بها أداة DropDownlist وكذلك Div وأعطهم إسمائهم .

- قم بإنشاء HttpHandler وسنضع به شرطين إما أن نطلب منه إمددنا بيبيانات تخص اداة DropDownlist أو GridView وهى هى وظيفته معنا .

- قم بإنشاء LINQ to SQL وهذة من المفترض أن تكون لديك منذ الدرس السابق .

- قم بإنشاء ملف JavaScript والذى سنضع به دوال العمل مع Jquery .

- قم بإنشاء ملف CSS لتنسيق أداة GridView .

محتويات الصفحات السابق ذكرها : Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="JqueryGetMethod.aspx.cs" Inherits="JqueryGetMethod" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Test Page </title>
     <link href="Style.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script src="JqueryScripts.js" type="text/javascript"></script>
</head>
<body onload="FillDropDownList();">
    <form id="form1" runat="server">
    <div>
    <h3>Please Select your Category</h3>
        <asp:DropDownList ID="DropDownList1" runat="server">
        </asp:DropDownList>
    <br />
   <br />
    <div id="GridViewDiv"></div>
    </div>
    </form>
</body>
</html>

لاحظ ان هذة المحتويات هى التى ستراها عند عرض View Source أثناء تشغيل الصفحة كما سبق الذكر .

محتويات ملف JQueryScripts.js

$(document).ready(function () {

    $("#DropDownList1").change(function () {
        $.get("DataHandler.ashx", 
 { Name: "Details", ID: $(this).val() },
 function (data) {
          		  $("#GridViewDiv").html(data);
       	 });
    });
});
function FillDropDownList() {
    $.get("DataHandler.ashx?Name=DDL", function (result) {
        $("#DropDownList1").html(result);
    });
}

أعتقد أنه لاتوجد تعقيدات فى الملف السابق لإنه لا يحتوى إلا على دالة لملئ أداة DropDownlist والجانب ألإخر من الكود ماهو إلا حدث إستجابة لإختيارات المستخدم Change وهو خاص بأداة DropDownList .

إلا انه يوجد إختلاف بسيط فى طريقة كتابة دالة get فى الملف حيث أنك ستجد اننا فى الدالة FillDropDownList تم الإعلان عن Parameters على أنها QueryString . وهى فى واقع الامر أياً كان شكلها فهى فى النهاية تمرر على انها QueryString . وستجد اننا فى حدث Change قد قمنا بتمرير هذة الـParameters بهذا الشكل : { Name: "Details", ID: $(this).val() } والواقع كما ذكرنا أنها ستمرر فى النهاية على أنها QueryString.

وكما رأيت إرسال الـParameters فهيا لنرى كيف تستقبل فى ملف HttpHandler وإليك محتوياته :

<%@ WebHandler Language="C#" Class="DataHandler" %>

using System;
using System.Web;
using System.Linq;
using System.Text;
using System.Web.UI;
using System.IO;
using System.Web.UI.WebControls;
public class DataHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        string Name = "";
        int ID = 0;
        if (context.Request["Name"] != null)
        {
            Name = context.Request["Name"];
        }
        if (context.Request["ID"] != null)
        {
            ID = Convert.ToInt32(context.Request["ID"]);
        }
        context.Response.ContentType = "text/plain";
        if (Name == "DDL")
        {
            var query = from q in new DataClassesDataContext().Categories
                        select new
                        {
                            CatergoyID = q.CategoryID,
                            CategoryName = q.CategoryName
                        };
            StringBuilder sb = new StringBuilder();
            foreach (var cat in query)
            {
                string option ="<option value=" + cat.CatergoyID + ">" + cat.CategoryName + "</option>";
                sb.Append(option);
            }
            context.Response.Write(sb.ToString());
        }
        else if (Name == "Details")
        {
            var query = from q in new DataClassesDataContext().Categories
                        where q.CategoryID == ID
                        select q;
            GridView gv = new GridView();
            gv.DataSource = query;
            gv.DataBind();

            StringBuilder sb = new StringBuilder();
            HtmlTextWriter htw = new HtmlTextWriter(new StringWriter(sb));
            gv.RenderControl(htw);

            context.Response.Write(sb.ToString());
        }
        else
        {
            context.Response.Write("Nothing");
        }
    }
    public bool IsReusable
    {
        get  {  return true;  }
    }
}

 

ليس به شئ جديد إلا فكرة بسيطة وهى إنشاء GridView إثناء وقت التشغيل وملئها بالبيانات ثم الحصول على اكواد HTML الخاصة بها ومن ثم تمريرها إلى الصفحة حسب الطلب وأقصد هذة الأسطر :

 StringBuilder sb = new StringBuilder();
HtmlTextWriter htw = new HtmlTextWriter(new StringWriter(sb));
gv.RenderControl(htw);

ومن ثم الإرسال بهذة الأمر :

context.Response.Write(sb.ToString());

أما عن عرض التنسيقات لهذة الآداة وأقصد GridView فهى تاتى كأى تنسيقات عادية فى ملف CSS كالتالى :

th
{
    background-color: Maroon;
    color: White;
    font-size: medium;
}
tr
{
    background-color: Olive;
}

من هذا : هل تعلم ان أداة GridView يتم عمل Render لها على انها Table كأى جدول عادى فهنا نحدد Table Heading و Table Row .

الخلاصة :

تعرفت على الدالة get وما تقدمه من الإتصال بالخادم والعودة ببيانات منه ومن ثم عرضها فى الصفحة للمستخدم , وأيضاً تعرفت على كيفية الحصول على أكواد Html لأى أداة من خلال إستخدام الدالة RenderControlويجب عليك التمرين علبها أكثر وأكثر فسيأتى يوم تريد أن ترسل GridView إلى البريد الإلكترونى أو تقوم بتصديرها إلى PDF أو أى نوع ملف آخر .كذلك إقتربنا اكثر من HttpHandler بعد أن أشرنا إليه فى الدرس الأول فقط . أيضاً قد تكون لاحظت المرونة التى تقدمها Jquery.

لاشك أن رأيك يهمنى كثيراً وربما يضيف جديد . أرنا تفاعلك مع الدرس هل قمت بالتطبيق ؟ .

ونكمل إن شاء الله المرة القادمة لمعرفة باقى الدوال والفرق بينهم وبعض الحيل

والسلام عليكم ورحمة الله

المرفقات
Part3.png

تم تعديل هذه المشاركة بواسطة Ahmed Moosa في 20 نوفمبر 2010 في 23:39

Ahmed Moosa

Microsoft Community Contributor | MCC

Microsoft Certified Professional Developer | MCPD

Microsoft Certified Technology Specialist | MCTS

Senior .NET Developer

.Net Trainer

English blog : http://weblogs.asp.net/ahmedmoosa/

مدونة عربى : http://ahmedmoosa.wordpress.com/

#2

اشكرك اخي الكريم على المقال الاكثر من رائع

واريك ان توضح لي ما فائدةو السترينق بلدر وال HtmlTextWriter مع اني ارى انه تم انشاء السترينق بلدر ولم ترسل له اي بيانات والذي بدورة تم ارساله الى HtmlTextWriter

فارجو التوضيح

else if (Name == "Details")

{

var query = from q in new DataClassesDataContext().Categories

where q.CategoryID == ID

select q;

GridView gv = new GridView();

gv.DataSource = query;

gv.DataBind();

StringBuilder sb = new StringBuilder();

HtmlTextWriter htw = new HtmlTextWriter(new StringWriter(sb));

gv.RenderControl(htw);

context.Response.Write(sb.ToString());

}

else

{

context.Response.Write("Nothing");

}

#3

السلام عليكم

آسف على التأخير .

ما هى إلا كاتب لمحتوى الآداة التى تم إستدعاء الدالة RenderControl لها . وتبدأ العملية عند إستدعاء هذة الدالة والتى بدورها تكتب محتوى الدالة (HTML) إلى HtmlTextWriter والتى تتطلب لعملها TextWriter ومنها إلى StringBuilder وكان يمكن أن نستغنى عنها فى حالة التعريف هكذا :

 System.IO.TextWriter tw = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htw = new HtmlTextWriter(tw);

يمكنك تصفح HtmlTextWriter والإستزادة منها فستحتاج ان تستخدمها عند عمل Custom Controls أى عمل اداوت خاصة بك . , والتى هى الإساس فى عملية Rendering للصفحة فى البداية ثم الأداوت التى بداخلها . ويمكنك رؤية دالة Render لتزداد فهما للعملية والتى الدالة التابعة لما يسمى Page Life Cycle والتى تأخذ الترتيب قبل الأخير فى هذة الدورة ودورها هو تحويل المحتوى إلى Html والذى يقوم بترجمته المتصفح وعرضه كواجهة يتم رؤيتها كأدوات مثال الصور والمفاتيح والجداول وغيرهم :

    protected override void Render(HtmlTextWriter writer)
    {
            base.Render(writer);
    }

وستجد ان الدالة Render تعمل بمساعدةHtmlTextWriter كما ترى بالأعلى .

وهى التى بدورها يمكن أن تضيف أو تحذف خصائص من الأداة التى نعمل عليها وهى هنا GridView . وهى الطريقة المشابهة عند بناء خصائص الأداة التى نقوم ببنائها عند عمل custom Controls

ومثال على ذلك :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ServerControl1
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:ServerControl1 runat=server></{0}:ServerControl1>")]
    public class ServerControl1 : WebControl
    {
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public string Text
        {
            get
            {
                String s = (String)ViewState["Text"];
                return ((s == null) ? "[" + this.ID + "]" : s);
            }

            set
            {
                ViewState["Text"] = value;
            }
        }

        protected override void RenderContents(HtmlTextWriter output)
        {
            output.Write(Text);
        }
    }
}

فترى الدالة RenderContents تعمل مع HtmlTextWriter وعليه يتم إستخدامها هكذا :

        protected override void RenderContents(HtmlTextWriter output)
        {
            output.RenderBeginTag(HtmlTextWriterTag.A);
            output.AddAttribute(HtmlTextWriterAttribute.Bgcolor, "red");
            output.Write(Text);
            output.AddAttribute(HtmlTextWriterAttribute.Value, HttpContext.Current.User.Identity.Name);
            output.RenderEndTag();
        }

شكراً لسؤالك .

تم تعديل هذه المشاركة بواسطة Ahmed Moosa في 26 نوفمبر 2010 في 22:59

Ahmed Moosa

Microsoft Community Contributor | MCC

Microsoft Certified Professional Developer | MCPD

Microsoft Certified Technology Specialist | MCTS

Senior .NET Developer

.Net Trainer

English blog : http://weblogs.asp.net/ahmedmoosa/

مدونة عربى : http://ahmedmoosa.wordpress.com/

#4

اشكرك اخي العزيز..

والله يجزيك الخير الكثير على هذا الجهد الرائع

موفق ان شاء الله

#5

ومزيد من التألق ..

ومنتظرين البقية ..

#6

دالة

Load

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

نجد أن دالة load يمكن ان تاتى لنا بجزء من الصفحة مثال Div أو P أو عنصر معين كجدول Table ..

أى يمكن عمل التالى :

$("#result").load("default.aspx    #container");

كما انها بعد أن تلاحظ ناتج السطر السابق فإن هذة الدالة تضيف الناتج من التنفيذ إلى العنصر التابعة له وهنا هو result (لابد أن تعرف أن result هو الـ id الخاص بأداة ما ). أى لا نحتاج إلى ما يسمى Callback وهى الدالة التى نستقبل بها الناتج مع انه يمكن ان نستخدمها هكذا :

        $("#result").load("default.aspx    #container", function (data) {
                   $(this).html(data);
        });

هناك سطر لا فائدة منه وهو هذا السطر :

  $(this).html(data);

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

الأمر ليس سحراً فليس هناك شئ إلا أن دالة load بها Built-in Callback . وهو تفسير الأسطر السابقة . وهذا إيضاً إختلاف يعد فرقاً بين دالة load وبين دالة get .

ولكثرة المشاكل التى تنتج عند العمل مع ControlID (الحقيقة مع من لا يعرف سير العملية فى التسمية والأدوات التى تحتوى أداوت أخرى والحالات التى تتبعها كوجود اداة داخل Master page , User Control, Data Bound controls, Update panel ) فربما تجد تعاملك من خلال إستخدام CSS Class مريح وهو كالتالى:

$("#result").load("default.aspx    .classname");

فى واقع الأمر يرجع هذا إلى مدى معرفتك بما يسمى Selector فى Jquery Library .

مع موعد مع البقية إن شاء الله .

تم تعديل هذه المشاركة بواسطة Ahmed Moosa في 27 نوفمبر 2010 في 21:40

Ahmed Moosa

Microsoft Community Contributor | MCC

Microsoft Certified Professional Developer | MCPD

Microsoft Certified Technology Specialist | MCTS

Senior .NET Developer

.Net Trainer

English blog : http://weblogs.asp.net/ahmedmoosa/

مدونة عربى : http://ahmedmoosa.wordpress.com/

#7

السلام عليكم اخي أحمد

فيه كتب تتكلم عن هذي المواضيع المتقدمة ..

اذا فيه.. ممكن تدينا هم ..

وسنكون لكم من الشاكرين ...

وعين الله ترعاكم

تم تعديل هذه المشاركة بواسطة shama1984 في 29 نوفمبر 2010 في 13:22

#8
shama1984 كتب:

فيه كتب تتكلم عن هذي المواضيع المتقدمة ..

اذا فيه.. ممكن تدينا هم ..

السلام عليكم ورحمة الله

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

شكراً على حرصك للتعلم .

تم تعديل هذه المشاركة بواسطة Ahmed Moosa في 29 نوفمبر 2010 في 17:18

1

Ahmed Moosa

Microsoft Community Contributor | MCC

Microsoft Certified Professional Developer | MCPD

Microsoft Certified Technology Specialist | MCTS

Senior .NET Developer

.Net Trainer

English blog : http://weblogs.asp.net/ahmedmoosa/

مدونة عربى : http://ahmedmoosa.wordpress.com/

مواضيع مشابهة