Bonjour à tous,
Je suis confronté à un probleme dans mon dev à savoir :
J'essaye de me former au dev d'un site .NET avec ajax (et callback) et j'ai une page qui incorpore un menu qui declenche l'initialisation d'un usercontrol selon le lien dans un placeholder qui se trouve dans un updatepanel :
fichier default.aspx
[CODE]<asp:Menu ID="Menu1" runat="server" OnMenuItemClick="Menu1_MenuItemClick">
<Items>
<asp:MenuItem Text="Mon Profil"></asp:MenuItem>
<asp:MenuItem Text="Ma Selection"></asp:MenuItem>
</Items>
</asp:Menu>
<asp:UpdatePanel ID="UPContent" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<div id="content">
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
</div>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Menu1" />
</Triggers>
</asp:UpdatePanel>[/CODE]
fichier default.aspx.cs
[CODE]public partial class default: System.Web.UI.Page
{
private const string BASE_PATH = "~/UserControl/";
private string LastLoadedControl
{
get
{
return ViewState["LastLoaded"] as string;
}
set
{
ViewState["LastLoaded"] = value;
}
}
private void LoadUserControl()
{
string controlPath = LastLoadedControl;
if (!string.IsNullOrEmpty(controlPath))
{
PlaceHolder1.Controls.Clear();
UserControl uc = (UserControl)LoadControl(controlPath);
uc.ID = "profil";
PlaceHolder1.Controls.Add(uc);
}
}
protected void Page_Load(object sender, EventArgs e)
{
LoadUserControl();
}
protected void Menu1_MenuItemClick(object sender, MenuEventArgs e)
{
MenuItem menu = e.Item;
string controlPath = string.Empty;
switch (menu.Text)
{
case "Mon Profil":
controlPath = BASE_PATH + "profil.ascx";
break;
case "Recherche":
controlPath = BASE_PATH + "recherche.ascx";
break;
default:
controlPath = BASE_PATH + "recherche.ascx";
break;
}
LastLoadedControl = controlPath;
LoadUserControl();
}
}
[/CODE]
=> Toute cette partie semble fonctionner, je n'ai pas d'erreur et j'ai bien chargement du usercontrol correspondant sans rechargement de la page complete.
Par contre mon profil.ascx (qui fonctionnait parfaitement lorsqu'il etait une page aspx et non usercontrol) n'arrive plus a effectuer de callback (j'ai un champs code postal de type textbox qui declenche un callback pour créer une dropdownlist des villes correspondantes)
fichier profil.ascx
[CODE]<%@ Control Language="C#" AutoEventWireup="true" CodeFile="profil.ascx.cs" Inherits="UserControl_login" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<table>
<tr>
<td>
Nom :</td>
<td>
<asp:TextBox ID="txnom" runat="server" CssClass="unwatermarked"></asp:TextBox><br />
<cc1:TextBoxWatermarkExtender ID="marknom" TargetControlID="txnom" WatermarkText="Votre Nom" WatermarkCssClass="watermarked" runat="server">
</cc1:TextBoxWatermarkExtender>
</td>
</tr>
<tr>
<td>
Prénom :</td>
<td>
<asp:TextBox ID="txprenom" runat="server" CssClass="unwatermarked"></asp:TextBox><br />
<cc1:TextBoxWatermarkExtender ID="markprenom" TargetControlID="txprenom" WatermarkText="Votre Prénom" WatermarkCssClass="watermarked" runat="server">
</cc1:TextBoxWatermarkExtender>
</td>
</tr>
<tr>
<td>
Adresse :</td>
<td><asp:TextBox ID="txadresse" runat="server" CssClass="unwatermarked" Width="250"></asp:TextBox></td>
</tr>
<tr>
<td>
Code postal :</td>
<td><asp:TextBox ID="txcp" runat="server" CssClass="unwatermarked"></asp:TextBox></td>
</tr>
<tr><td colspan="2">
<asp:Panel ID="Panel1" CssClass="hideville" runat="server">
<asp:Label ID="lblville" runat="server" Text="Ville :"></asp:Label>
<asp:DropDownList ID="DDLVille" runat="server">
</asp:DropDownList>
</asp:Panel>
<span id="myDiv" class="spanville" runat="server"></span>
</td></tr>
<tr>
<td>
Téléphone :</td>
<td><asp:TextBox ID="txtel" runat="server" CssClass="unwatermarked"></asp:TextBox></td>
</tr>
<tr>
<td>
Mobile :</td>
<td><asp:TextBox ID="txmobile" runat="server" CssClass="unwatermarked"></asp:TextBox></td>
</tr>
<tr><td colspan="2" align="center">
<asp:Button ID="btnsubmit" OnClick="btnsubmit_Click" runat="server" Text="Valider" /><br />
<asp:Label ID="lblConfirmMsg" runat="server" Text=""></asp:Label>
</td>
</tr>
</table>
</ContentTemplate>
</asp:UpdatePanel>[/CODE]
profil.ascx.cs
[CODE]public partial class UserControl_inscription : System.Web.UI.UserControl, System.Web.UI.ICallbackEventHandler
{
protected String returnValue;
// A Implementer plus tard pour la gestion de l'updatepanel au sein du usercontrol ?
//public UpdatePanelUpdateMode UpdateMode
//{
// get { return this.UpdatePanel1.UpdateMode; }
// set { this.UpdatePanel1.UpdateMode = value; }
//}
//public void Update()
//{
// this.UpdatePanel1.Update();
//}
internal static string ConnectionString
{
get { return ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString(); }
}
protected void Page_Load(object sender, EventArgs e)
{
Page.Header.Title = "Edition du Profil";
txcp.Attributes.Add("onChange", "GetVilleByZip();return false;");
ddlpays.Attributes.Add("onchange", "ChangePays();");
// NE semble pas fonctionner dans inclusion directe au sein de la page default.aspx
//HtmlGenericControl include = new HtmlGenericControl("script");
//include.Attributes.Add("language", "JavaScript");
//include.Attributes.Add("type", "text/javascript");
//include.Attributes.Add("src", "profil.js");
//Parent.Page.Header.Controls.Add(include);
// Gestion duCallback
string sbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
string cbScript = String.Empty;
if (!Page.ClientScript.IsClientScriptBlockRegistered("CallServer"))
{
cbScript = @" function CallServer(arg,context) { " + sbReference + "} window.setTimeout(CallServer,100); ";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer", cbScript, true);
}
if (Request.IsAuthenticated)
{
MembershipUser u = Membership.GetUser();
ProfileCommon pc = Profile.GetProfile(Page.User.Identity.Name);
txnom.Text = pc.nom;
txprenom.Text = pc.prenom;
txtel.Text = pc.tel;
txmobile.Text = pc.mobile;
txadresse.Text = pc.adr;
txcp.Text = pc.cp;
txville.Text = pc.ville;
ddlpays.SelectedValue = pc.pays;
if (pc.pays == "FR")
{
txville.Enabled = false;
}
btnsubmit.Text = "Mettre à Jour";
}
}
private string GetVilleByZip(string ZipCode)
{
// Datareader et rendu du control dropdownlist
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
DDLVille.RenderControl(htw);
htw.Flush();
return sw.ToString();
}
protected void btnsubmit_Click(object sender, EventArgs e)
{
try
{
// Traitement des infos de mise à jour du profil
}
catch (Exception ex)
{
lblConfirmMsg.Text = ex.Message;
}
}
#region ICallbackEventHandler Members
public string GetCallbackResult()
{
return GetVilleByZip(returnValue);
}
public void RaiseCallbackEvent(string eventArgument)
{
returnValue = eventArgument;
}
#endregion
}[/CODE]
=> Et là impossible d'avoir un callback, Firebug me retourne CallServer is not defined ...
Si quelqu'un a une idée pour me sortir de là, si vous avez également des idées plus interesantes pour construire tout cela ...
Merci d'avance