2009-09-21 6 views
1

Essayer de faire apparaître une IFrame Shadowbox avec Jquery à partir d'un tableau de données asp: gridview. Je ne peux pas obtenir les citations appropriées dans la chaîne:Asp.Net et Shadowbox

<asp:ImageButton ID="btnEdit" runat="server" 
    OnClientClick='<%# "javascript:popAccount(\'"+ 
    Eval("id", "Popup.aspx?id={0}")+"\');" %>' /> 

Parser Message d'erreur: La balise de serveur est pas bien formé.

Sans les guillemets simples échappées (peut ne pas fonctionner, mais parse correctement):

<asp:ImageButton ID="btnEdit" runat="server" 
    OnClientClick='<%# "javascript:popAccount("+ 
    Eval("id", "Popup.aspx?id={0}")+");" %>' /> 

HTML côté client, comme prévu:

onclick="javascript:popAccount(Popup.aspx?id=3ce3b19c-1899-4e1c-b3ce-55e5c02f1);" 

Comment puis-je obtenir des citations dans le Javascript?

Editer: solution ajoutée. Ce n'est pas très générique, car les types de bases de données doivent être connus pour accéder à la propriété id. La clé (telle que définie dans le paramètre DataKeyNames de GrodView) ne semble pas être exposée dans l'argument d'événement. Mais ça fonctionne.

protected void editGrid_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     // do not look at header or footer 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      ImageButton btn = e.Row.FindControl("btnPopup") as ImageButton; 
      if (btn != null) 
      { 
       btn.OnClientClick = 
       "javascript:popAccount('EditAccountPopup.aspx?"+ 
       Constants.acctidParam+"="+ 
       ((tb_account)(e.Row.DataItem)).id.ToString()+"');"; 
      } 
     } 

Répondre

1

Décrochez le ImageButton en cas de RowDataBound GridView dans le behind et ajoutez la propriété à partir de là. Mais êtes-vous sûr de vouloir utiliser un contrôle serveur? Que diriez-vous juste une image simple? Si vous "remplacez" le comportement de clic du ImageButton, il ne semble pas que vous en ayez besoin du tout.

Mise à jour:

Pour la solution code-behind, je codé ce petit échantillon (en VB.NET, désolé):

Private Sub gridview1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gridview1.RowDataBound 
    Select Case e.Row.RowType 
     Case DataControlRowType.DataRow 
     Dim btnEdit As ImageButton = CType(e.Row.Cells(0).FindControl("btnEdit"), ImageButton) 
     Dim strID As String = CType(e.Row.DataItem, Guid).ToString 

     btnEdit.Attributes.Add("onclick", String.Format("javascript:popAccount('Popup.aspx?id={0}');", strID)) 
    End Select 
    End Sub 

Cependant, je vous recommande encore vous allez avec une approche plus simple, jQuery est excellent ici. Pas besoin de tout code dans votre behind:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 

    <script src="http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.min.js" type="text/javascript"></script> 

    <script type="text/javascript" language="javascript"> 
    $(document).ready(function() { 

     $("img.edit").click(function() { 
     var sID = this.id.replace('btnEdit_', ''); 
     alert(sID); // Add your popup opening logic here... 
     }); 
    }); 
    </script> 

</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
    <asp:GridView ID="gridview2" AutoGenerateColumns="false" runat="server"> 
     <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
      <img id="btnEdit_<%#Container.DataItem %>" class="edit" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 
    </div> 
    </form> 
</body> 
</html> 
+0

Est-ce important pour ce problème? Je dois utiliser la balise de connexion de données de toute façon ... – cdonner

+0

Merci pour votre réponse. J'ai mis à jour mon post pour inclure une suggestion pour une solution qui utilise codebehind, et une version plus simple utilisant jQuery. –

0

Si vous voulez garder votre code la façon dont il est, pourquoi ne pas le faire cela?

<asp:ImageButton ID="btnEdit" runat="server" 
    OnClientClick='<%# "javascript:popAccount(&quot"+ 
    Eval("id", "Popup.aspx?id={0}")+"&quot);" %>' /> 
+0

Ce serait bien, mais ne fonctionne pas dans IE7. – cdonner

+0

J'ai essayé différents types de documents (strict/transitionnel) en mode de compatibilité IE8 et je reçois une exception de cette ligne. Cela fonctionne en mode Standards. – cdonner

+0

Un appel de fonction codé en dur fonctionne correctement dans tous les modes de IE8. – cdonner