Archive

Posts Tagged ‘Cross-page Posting’

Cross-page PostBack , PostBackUrl

บทความนี้เป็นบทความต่อเนื่องจาก บทความเรื่อง PostBack ผมได้ทิ้งท้ายไว้ว่า PostBack นั้นใช้งานเฉพาะใน single page และ หากต้องการที่จะทำ Postback ระหว่าง Page นั้นผมก็จะมาพูดในบทความนี้ โชคดีที่เราอ้างอิง ASP.NET 2.0 เพราะว่าเป็น approach ที่เพิ่งจะมีใน version นี่ครับ ส่วนท่านที่ใช้ version ก่อนหน้านี้ รู้สึกว่าจะไม่มีนะครับ ไม่มีไม่ไดหมายความว่าทำไม่ได้นะครับ เขาใช้ Server.Transfer ซึ่งเราก็จะพูดกันใน บทความนี้ด้วยเช่นเดียวกัน

เรามาพูดถึง เรื่อง Cross-Page postbacks กันต่อครับว่า สิ่งที่เป็นส่วนประกอบพื้นฐานที่ทำให้เกิดการทำงานลักษณะนี้ก็คือ property ที่เรียกว่า PostBackUrl ซึ่ง กำหนดโดย interface ที่ชื่อ IButtonControl และใช้งานใน Button controls ต่าง ๆ เช่น ImageButton, LinkButton, และก็ Button

การใช้งาน cross-page posting สามารถทำได้โดย การกำหนด ค่า PostBackUrl ให้อ้างอิงไปยัง webpage ที่เราต้องการ ( web form นะครับ ) เมื่อใดที่ user คลิก ปุ่ม Page จะทำการ posts ไปยัง page ที่กำหนดไว้ที่ PostBackUrl พร้อมกับค่าต่าง ๆ ใน input controls ของ page ปัจจุบัน คงพอจะเห็น ภาพนะครับ เราลองมาดูตัวอย่างกันนะครับ

สมมุติว่า เราสร้าง web form (CrossPage1.aspx)ที่มี text box อยู่สอง text box และ button ซึ่งเราจะกำหนด ให้ post ไปยัง page ที่ชื่อว่า Crosspage2.aspx

.
.

Untitled Page




และใน CrossPage2.aspx.cs สามารถที่ ตรวจสอบการ post จาก CrossPage1.aspx ได้โดยใช้ Page.PreviousPage property ตามตัวอย่าง

.
.
using System.Web.UI.HtmlControls;

public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Page.PreviousPage != null && Page.PreviousPage.IsCrossPagePostBack)
{
TextBox tFirstName = (TextBox)Page.PreviousPage.FindControl(“txtFirstName”);
TextBox tLastName = (TextBox)Page.PreviousPage.FindControl(“txtLastName”);
Label1.Text = “Hello ” + tFirstName.Text + ” ” + tLastName.Text;
}
}
}

จาก ตัวอย่าง code นั้นสามารถอธิบายได้ว่า หากมีการ post มาจาก page ก่อนหน้า ( ซึ่งค่า PerviousPage.IsCrossPagePostBack จะเท่ากับ true และ PreviousPage นั้จะต้องไม่เป็น null ด้วย ) และแสดงข้อมูลที่กรอก ใน TextBox txtFirstName และ txtLastName เป็นตัวอย่าง ง่าย ๆ สามารถนำไปประยุกค์ใช้ได้เลย นะครับ

มาพิจารณาตรงนี้เพิ่มเติมสักนิดนะครับเรื่องวิธีการส่งค่าระหว่าง Page หรือวิธีการทำเพื่อให้สามารถ ส่งค่าระหว่าง page ได้ วิธีแรกก็คือวิธีที่แสดงไว้ในตัวอย่างแรก นะครับเราสามารถที่จะใช้ FindControl method เพื่อตรวจสอบหา control id ที่กำหนด ซึ่งเป็นวิธีที่นิยมใช้กัน

มีอีกวิธีหนึ่ง คือการกำหนด previous page ใน PreviousPageType directive ใน page ที่จะรับข้อมูลในตัวอย่างของเราก็คือใน CrossPage2.aspx วิธีนี้จะทำให้เราสามารถเข้าถึง public member ของ web form ได้นะครับ โดยไม่ต้องทำการ casting ดังจะแสดงให้ดู
เราจะทำการเพิ่ม property ให้กับ CrossPage1.aspx.cs ดังนี้นะครับ

protected void Page_Load(object sender, EventArgs e)
{
}
public string FirstName
{
get { return (!string.IsNullOrEmpty(txtFirstName.Text)) ? txtFirstName.Text : string.Empty; }
}
public string LastName
{
get { return (!string.IsNullOrEmpty(txtLastName.Text)) ? txtLastName.Text : string.Empty; }
}

และที่ CrossPage2.aspx เราจะเพิ่ม PreviousPageType ต่อจาก Page directive ดังนี้

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CrossPage2.aspx.cs" Inherits="Default2" %>
<%@ PreviousPageType VirtualPath="CrossPage1.aspx" %>
.
.

ซึ่งจะทำให้เราสามารถอ้างอิงได้ ดังนี้

.
.
if (Page.PreviousPage != null && Page.PreviousPage.IsCrossPagePostBack)
{
string lFirstName = PreviousPage.FirstName;
string lLastName = PreviousPage.LastName;
Label1.Text = “Hello ” + lFirstName + ” ” + lLastName;
}
.
.

ครับ พอจะเห็นภาพนะครับ วิธีที่สองนี้เป็นวิธีที่ดีอีกเหมือนกันแต่ ข้อด้อยก็คือ มัน specific มากเกินไปครับ ก็คือมันจะต้องเป็นการเรียกผ่านมาจาก CrossPage1.aspx เท่านั้น ในบ้างเหตุการเราอาจะต้องการ ให้ page หนึ่งสามารถรับค่าจาก page ต่าง ๆ กันได้ ข้อดีก็คือมันสามารถอ้างอิง public member ได้เลยเพราะมันเป็น strongly type access

คงพอจะได้ concept นะครับ ที่การทำ cross-page postback นี่สามารถทำได้อีก วิธีหนึ่งโดยใช้ Server.transfer ผมจะเอาไว้พูดในบทความถัดไปนะครับ เพราะเริ่ม เมื่อยแล้ว สำหรับบทความนี้ใครสงสัยอะไรก็ ถามกันได้นะครับ หรือจะ mail มาถามก็ได้ s_teerapong2000@yahoo.com 🙂