Copyright © 2003-2009
By Suthep Sangvirotjanaphat
  Mobile: 089-967-2200, 081-915-7816
Phone: 0-2992-4877   Fax: 0-2992-4878
Fast Contact Us

GreatFriends.Biz Community

Custom Search
Copy เพื่ออ้างอิงถึงข้อความนี้:
 MESSAGE #117964 (อ่าน 2,272 ครั้ง)

การใช้ jQuery + AJAX + WebService อย่างง่าย

Tags: Web, Web Services, C#, jQuery, .NET 3.5, Blog, Article

การใช้ jQuery + AJAX + WebService อย่างง่าย

 

ไฟล์ที่จำเป็น

- jQuery เวอร์ชัน 1.3.2

 

จากนั้นเราจะมาทำการติดตั้ง jQuery กัน

วิธีการติดตั้ง jQuery

  1. Download จาก http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.3.2.min.js
  2. ในโปรเจ็ค สร้าง Folder ชื่อ js
  3. เอาไฟล์ jQuery.1.3.2.min.js ไปไว้ที่ Folder ชื่อ js ในข้อ 2. เป็นอันเสร็จ

 

เป้าหมาย : รับข้อมูลจาก หน้าเว็บ 2 ค่าแล้วส่งค่าให้ Web service คำนวณ โดยใช้วิธีการส่งค่าแบบ AJAX ด้วย jQuery

 

ในหน้า Default.aspx แล้วใส่คอนโทล ตามนี้

 

- Label ชื่อ lblResult 1 ตัว เพื่อแสดงผล

- TextBox มา 2 ตัว ชื่อ txtX กับ txtY เพื่อรับค่า

- จากนั้นก็เอาปุ่มมาวางไว้ 4 ปุ่ม เป็น Input(Button) ชื่อ btnAdd, btnDiff, btnMul, btnDiv

 

หน้าตาก็จะประมาณนี้นะครับ

 

ในหน้า  Default.aspx

เราจะมาทำการผูก Event ให้แต่ละปุ่มกันนะครับ

 

-          เริ่มจากการ Link ไฟล์ jQuery.1.3.2.min.js เพื่อที่จะได้ใช้คำสั่งของ jQuery ได้

<script type="text/javascript" src="js/jquery-1.3.2.js"></script>

 

-          เขียน script ตามนี้เพื่อผูก Event

       

    <script language="javascript" type="text/javascript">

        $(document).ready(function() {

              $("#btnAdd").click(function() {

                  var pagePath = window.location.pathname;

                       $.ajax({

                            type: "POST",

                            url: pagePath + "/test",

                            data: '{x:' + $('#<%= this.txtX.ClientID %>').val() + ',y:' + $('#<%= this.txtY.ClientID %>').val() + ',mode:1}',

                            contentType: "application/json; charset=utf-8",

                            dataType: "json",

                            success: function(msg) {

                                $('#<%= this.lblResult.ClientID%>').html(msg.d);  

                            },

                            error: function(msg){alert("error : " + msg);}

                        });

                });

           

                $("#btnDiff").click(function() {

                      var pagePath = window.location.pathname;

                       $.ajax({

                            type: "POST",

                            url: pagePath + "/test",

                            data: '{x:' + $('#<%= this.txtX.ClientID %>').val() + ',y:' + $('#<%= this.txtY.ClientID %>').val() + ',mode:2}',

                            contentType: "application/json; charset=utf-8",

                            dataType: "json",

                            success: function(msg) {

                                $('#<%= this.lblResult.ClientID%>').html(msg.d);  

                            },

                            error: function(msg){alert("error : " + msg);}

                        });

                });

               

                $("#btnMul").click(function() {

                      var pagePath = window.location.pathname;

                       $.ajax({

                            type: "POST",

                            url: pagePath + "/test",

                            data: '{x:' + $('#<%= this.txtX.ClientID %>').val() + ',y:' + $('#<%= this.txtY.ClientID %>').val() + ',mode:3}',

                            contentType: "application/json; charset=utf-8",

                            dataType: "json",

                            success: function(msg) {

                                $('#<%= this.lblResult.ClientID%>').html(msg.d);  

                            },

                            error: function(msg){alert("error : " + msg);}

                        });

                });

               

                $("#btnDiv").click(function() {

                      var pagePath = window.location.pathname;

                       $.ajax({

                            type: "POST",

                            url: pagePath + "/test",

                            data: '{x:' + $('#<%= this.txtX.ClientID %>').val() + ',y:' + $('#<%= this.txtY.ClientID %>').val() + ',mode:4}',

                            contentType: "application/json; charset=utf-8",

                            dataType: "json",

                            success: function(msg) {

                                $('#<%= this.lblResult.ClientID%>').html(msg.d);  

                            },

                            error: function(msg){alert("error : " + msg);}

                        });

                });

          });

         

    </script>

 

 

ในหน้า  Default.aspx.cs

 

จากนั้นเราก็ทำการสร้าง WebService ที่ Code behid ของหน้านี้ โดยจะต้อง

 

using System.Web.Services;

 

ตัวนี้เข้ามาด้วย

 

ส่วน code ของ Web Service จะเป็นดังนี้ โดยจะแบ่ง mode ที่รับเข้ามาดังนี้

    -  mode 1 คือ การบวก

    -  mode 2 คือ การลบ

    -  mode 3 คือ การคูณ

    -  mode 4 คือ การหาร

public partial class _Default : System.Web.UI.Page

{

    [WebMethod]

    public static int test(int x ,int y ,int mode)

    {

        int Result;

 

        if (string.IsNullOrEmpty(x.ToString()))

        {

            x = 0;

        }

 

        if (string.IsNullOrEmpty(y.ToString()))

        {

            y = 0;

        }

 

        if ((mode == 4) && (y == 0))

        {

            y = 1;

        }

 

        switch (mode)

        {

            case 1: Result = (x + y); break;

            case 2: Result = (x - y); break;

            case 3: Result = (x * y); break;

            case 4: Result = (x / y); break;

            default: Result = 0; break;

        }

 

        return Result;

    }

}

 

เสร็จแล้วเราก็มาเทสกันเลย ผลก็จะได้ตามนี้ครับ

- บวก

- ลบ

- คูณ

- หาร

เสร็จแล้วครับ ไม่ยากใช่ไหมครับ ลองเอาไปประยุกใช้กันดูครับ

 

ใครสงสัย code ตรงไหนถามได้นะครับ พอดีเพิ่งลองทำเป็นครั้งแรกเนื้องจากว่าง

แต่ไม่ได้อธิบาย code ให้ละเอียดเท่าไหร เพราะไม่รู้ว่าควรจะอธิบายตรงไหนบ้าง

เอาเป็นว่าใครสงสัย code ตรงไหนถามมาแล้วกันนะครับ

อีกอย่าง ติ-ชม ให้ความเห็นกันไดนะครับ จะได้เอาไปปรับปรุงครับผม ^____^



Chariot วันที่ส่ง: 29 ธ.ค. 52 10:53 GMT+7
วันที่ปรับล่าสุด: 24 ม.ค. 53 12:04 GMT+7
REPLY #1 (117969)
เข้าใจง่ายดี code กระชับด้วย ขอบคุณคับ สำหรับบทความดี ๆ


rookie วันที่ส่ง: 29 ธ.ค. 52 13:40 GMT+7
วันที่ปรับล่าสุด: 29 ธ.ค. 52 13:40 GMT+7
REPLY #2 (117995)
ขอบคุณครับ


dinobenz วันที่ส่ง: 30 ธ.ค. 52 20:40 GMT+7
วันที่ปรับล่าสุด: 30 ธ.ค. 52 20:40 GMT+7
REPLY #3 (118010)
โค้ดจับอีเว้นต์ click ของปุ่มทั้งสี่นั้น มีโค้ดที่คล้ายกันมาก
ต่างกันเฉพาะค่า mode ที่จะส่งเป็น argument ให้กับ Web Method
จนถือว่าโค้ดซ้ำซ้อนกันเกินไป จะทำให้การ maintain โค้ดในอนาคตลำบาก
 
ในกรณีนี้ ผมพอนึกวิธีการแก้ปัญหาได้ 2 อย่าง
คือ การนำค่า mode ที่แตกต่างกันนั้น
ไปใส่ไว้ใน attribute (ดู .attr() ใน jQuery)
หรือไว้ใน data (ดู .data() ใน jQuery)
 
แต่เผอิญติดงานเสียแล้ว เดี๋ยวจะกลับมาขยายความใส่ตัวอย่างให้ครับ


surrealist วันที่ส่ง: 1 ม.ค. 53 15:25 GMT+7
วันที่ปรับล่าสุด: 1 ม.ค. 53 15:25 GMT+7
REPLY #4 (118015)

    ขอบคุณอาจารย์ที่แนะนำครับ จริง ๆ ผมเองก็เพิ่งเริ่ม ศึกษาครับเจ้า jQuery นี่ ได้สักพักเองครับ ตอนแรกก็เฉย ๆ แต่พอได้ลองแล้วมันสนุกมากครับเจ้าตัวนี้ ทำให้การเขียน javaScript ง่ายขึ้นมาก

 
    แล้วอีกอย่างผมไม่อยากให้ code มันซับซ้อนมากอะครับ เลยแยกให้เห็นชัด ๆ เด๋วผมจะลองไปหาวิธีรวบ code ให้มันสั้นลง ตามที่อาจารย์แนะนำมา แล้วจะเอามา Post ให้ใหม่นะครับ
 
สวัสดีปีใหม่นะครับ เพื่อน ๆ พี่ ๆ น้อง ชาว GF ทุกท่าน ขอให้มีความสุข รวย ๆ ๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆ กันทุกคนครับผม


Chariot วันที่ส่ง: 1 ม.ค. 53 21:12 GMT+7
วันที่ปรับล่าสุด: 1 ม.ค. 53 21:12 GMT+7
REPLY #5 (118017)
มาแล้วครับฉบับปรับปรุง รวดเร็วทันใจครับ
 
code หน้า .aspx นะครับ
 
โดย Version นี้ผมได้ใส่ แอดทริบิว title เพิ่มเข้าไปที่ปุ่มทั้งสี่ ตามนี้ครับ
 
- ในส่วน body นะครับ
 
- ในส่วน head เราก็ทำการ link ไฟล์ jQuery เข้ามาเหมือนเดิม
 
- ต่อมาก็เขียน script ผูก event ของทั้งปุ่มและ Textbox
โดยตัวปุ่มผมจะให้ไปเรียก function testButton() ซึ่งเขียนไว้เรียกใช้ AJAX อีกทีนึงโดยส่งค่าที่จำเป็นเข้าไปคือ
     X ได้จาก TextBox ชื่อ txtX ,
     Y ได้จาก TextBox ชื่อ txtY,
    Mode ได้จากค่า แอตทริบิว titlte ของแต่ละปุ่ม
 
และตัว Textbox ผมได้เพิ่ม Event OnKeypress เข้ามาเพื่อทำการตรวจสอบค่าที่กรอกเข้ามาต้องเป็นตัวเลขครับ
 
- ส่วนต่อมาคือ function testButton() ซึ่งจะรับค่าตัวแปร 3 ตัว ดังที่กล่าวมาข้างต้น และทำการตรวจสอบค่าเล็กน้อย พอเป็นพิธี อิอิ
หมายเหตุ : จากที่เคยเขียนมา การเขียน function ที่เอาไว้เรียกเฉพาะ AJAX แบบนี้ถ้าเขียนด้วย javaScript ธรรมดา จะไม่สามารถเรียก function นี้ซ้ำได้ (จริง ๆ มันอาจทำได้ แต่ผมทำไม่เป็น พอดีว่า javaScript อ่อนหัด เลยไม่รู้วิธีอิอิ) ผมเลยทำแบบวิธีที่ post คราวแรก (กลัว error + เอาง่ายไว้ก่อน 555+) แยกเป็นของใครของมัน แต่พอมาลองใช้ jQuery ปรากฎว่ามันสามารถนำมา reuse ได้ ซึ่งมันแหล่ม มาก ๆ เลยครับ อิอิ
 
สุดท้ายก็จะเป็น code ในส่วน ของหน้า .aspx.cs หรือ code behide นั้นเอง
 
ได้ปรับ code ให้สั้นลงเพราะทำการ ตรวจสอบค่าส่วนใหญ่ไว้ที่หน้า .aspx แล้ว


Chariot วันที่ส่ง: 1 ม.ค. 53 22:53 GMT+7
วันที่ปรับล่าสุด: 1 ม.ค. 53 22:53 GMT+7
REPLY #6 (118033)
เพิ่งกลับจากธุระของพ่อตาที่จังหวัดตราด
 
ผมถือว่าช่วย comment เพื่อสนุกและเสริมความรู้
จากผู้เขียนบทความเพิ่มให้อีกหน่อยนะครับ
ไม่ได้จับผิดหรืออะไร การปรับปรุงโค้ดของเราตอนนี้
วิธีที่หนึ่ง คุณ Chariot ได้จัดการแสดงได้เรียบร้อยแล้ว
 
 
ผมมาเพิ่มวิธีที่สองให้ดูครับ
 
$(document).ready(function() {
    // 1 init data
    $("#btnAdd").data("mode", 1); // set data "mode" = 1 ให้กับ button โดยไม่ต้องใส่ attribute
    $("#btnDiff").data("mode", 2);
 
    // 2 how to use data
    var mode;
    $(":button").click(function() {
        var mode = $(this).data("mode"); // get data "mode"
        $(this).val(mode);
    });
 
});
 
 
jQuery.data() จะทำให้เราสามารถฝากข้อมูล
ไว้กับ jQuery object ได้โดยไม่ปรากฏเป็น attribute ใน DOM เลย
 
 
ลองประยุกต์กันดูนะครับ.
 


surrealist วันที่ส่ง: 2 ม.ค. 53 19:18 GMT+7
วันที่ปรับล่าสุด: 2 ม.ค. 53 19:18 GMT+7
REPLY #7 (118061)
ขอลองเอาไปทดสอบหน่อย ^__^


mr.l วันที่ส่ง: 4 ม.ค. 53 16:36 GMT+7
วันที่ปรับล่าสุด: 4 ม.ค. 53 16:36 GMT+7
REPLY #8 (118078)

ขอบคุณอาจรย์ที่มาช่วยเสริมครับ ผมจะได้เก็บเอาไปลองอีกวิธี และขอบคุณผู้อ่านทุกท่านที่ให้ความสนใจครับ

 
และ เร็ว ๆ นี้จะมี บทความเกี่ยวกับ jQuery มาให้อ่านกันอีกนะครับ ผมกะเอาไว้ว่าจะเขียนตั้งแต่เริ่มเลยครับ เผื่อเป็นประโยชน์กับเพื่อน ๆ บ้าง
 
ปล.จะมีคนอ่าน ไม่อ่านไม่สนแต่อยากเขียน อย่างน้อยก็เอาไว้เป็น Reference ให้ตัวเอง 555+


Chariot วันที่ส่ง: 4 ม.ค. 53 21:43 GMT+7
วันที่ปรับล่าสุด: 4 ม.ค. 53 21:43 GMT+7
REPLY #9 (118697)
นานๆมาบอร์ดทีดีๆทั้งนั้น  ขอบคุณมากมายครับ ผมเขียนอยู่พอดี


ed วันที่ส่ง: 22 ม.ค. 53 15:40 GMT+7
วันที่ปรับล่าสุด: 22 ม.ค. 53 15:40 GMT+7
REPLY #10 (118749)

รบกวนถามครับ ถ้าต้องการแบบว่าเปลี่ยนservice หรือ method เฉพาะบางเงื่อนไขจะได้มั้ยครับ คือผมลองเปลี่ยนแล้วมันไม่เข้า serviceอะครับ

 
เช่น 
 
อยากเชคเงื่อนไขในการลบข้อมูลจังหวัด อำเภอ  ว่า จังหวัดมีชื่ออำเภอมั้ย หรือว่าถ้าจะลบอำเภอก็เชตว่ามีตำบลมั้ย
ให้เข้าไปอีก ตาม method checkDel  แล้วให้return ค่าออกมา
ถ้าค่าที่รีเทินออกมามีค่าเป็น false ก้ให้ alert(ลบไม่ได้เน่องจาก......)
ถ้า true ก้ให้เปลี่ยนไปเข้า method อีกอันนึงที่ทำการลบออกจากฐานข้อมูล
 
ปล. คือผมใช้เป็น dataView,dataContext ของ ajax 4 ครับ รบกวนด้วยครับ


basketman วันที่ส่ง: 24 ม.ค. 53 12:04 GMT+7
วันที่ปรับล่าสุด: 24 ม.ค. 53 12:04 GMT+7

ตอบข้อความ/ร่วมแสดงความคิดเห็น

กรุณา Sign In / เข้าสู่ระบบ เพื่อโพสต์หรืออ่านข้อความ
ยังไม่ได้สมัครสมาชิก? Sign Up / สมัครสมาชิกใหม่
10 ก.ย. 10:10
Online: 217