CrossPage Posting
Les développeurs PHP ou ASP notamment ont l'habitude dans leur formulaire web de définir l'attribut « action » du formulaire pour déterminer dans quelle page seront envoyées les données du formulaire. Or ce genre de manipulation n'est pas réalisable en ASP.NET 1.0 et 1.1 même en fixant manuellement l'attribut « action » (la manipulation n'est pas prise en compte par le processus ASP.NET).
En effet en ASP.NET 1, le PostBack (publication du formulaire) se fait obligatoirement sur la même page sauf si le développeur réalise une implémentation de crosspage posting (voir à la fin du chapitre). Avec ASP.NET 2.0, ce problème a été résolu car vous allez pouvoir effectuer une publication sur une autre page en définissant une simple propriété sur le contrôle provoquant la publication : c'est ce qu'on va appeler le CrossPage Posting. Pour vous expliquer au mieux cette fonctionnalité, nous allons mettre en place un petit scénario :
- Nous avons dans une application Web deux pages « Users.aspx » affichant la liste des utilisateurs de notre site dans le but de l'éditer et une page « EditUser.aspx » pour éditer l'utilisateur sélectionné dans la WebForm « Users.aspx ». Nous allons donc effectuer un crosspage Posting de la page « Users.aspx » vers la page « EditUser.aspx ».
La page « Users.aspx » contient trois contrôles : « literalcontrol », « DropDownList », et notre contrôle de publication « Button » :

Et nous avons crée une propriété « SelectedUser » qui retourne l'utilisateur sélectionné dans le contrôle « DropDownList » :
public string SelectedUser
{
get
{
return lstUsers.SelectedItem.Value;
}
} |
Il nous reste plus qu'à activer le CrossPage Posting à partir de notre contrôle « Button ». Pour cela nous allons utiliser la propriété « PostBackUrl » pour spécifier la page où s'effectuera la publication (ici « EditUser.aspx ») :
< asp : button
id ="btnEditUser"
runat ="server"
text ="Editer Utilisateur"
postbackurl ="~/EditUser.aspx" /> |
A présent la publication s'effectuera sur la page « EditUser.aspx » et non plus « Users.aspx ». La question se pose à présent comment récupérer les informations de la page précédente « Users.aspx » une fois la publication effectuée.
Tout d'abord, vous devez ajouter sur la page « EditUser.aspx » une nouvelle directive « PreviousPageType » en lui spécifiant en attribut soit l'url de la page provoquant le PostBack ou son type :
| <%@ previouspagetype virtualpath ="~/Users.aspx" %> |
A partir de là, vous allez pouvoir utiliser au sein de votre page la propriété « PreviousPage » qui sera typée sur la classe de votre page « Users.aspx » et c'est donc pour cela que nous pouvons faire appel à la propriété « SelectedUser » à partir de « PreviouisPage », propriété que nous avons créée dans le codebehind de notre page « Users.aspx ».
void Page_Load( object sender, EventArgs e)
{
literal1.Text = PreviousPage.SelectedUser;
} |
Ou encore en passant par la méthode FindControl pour retrouver notre contrôle :
void Page_Load( object sender, EventArgs e)
{
literal1.Text = ((DropDownList)PreviousPage.FindControl("lstUsers")).SelectedItem.Value;
} |
Dernier point : Comment déctecter à partir de la page « EditUser.aspx » qu'il y a un CrossPage Posting à partir de la page « Users » ? Tout simplement à partir de la propriété « PreviousPage » :
if (PreviousPage.IsCrossPagePostBack)
{
//votre code...
} |
En ce qui concerne ASP.NET 1.x, vous avez plusieurs articles dont un publié sur CodeProject : http://www.codeproject.com/aspnet/jsnopostback.asp#xx842091xx , articles qui vont vous permettre de réaliser votre propre implémentation du CrossPage Posting en ASP.NET 1.x.