ASP.Net UpdatePanel + Gridview + Hyperliens + plugin jQuery nyroModal - nouvelle ouverture de la fenêtre entière, mais je veux juste un modal
-
21-08-2019 - |
Question
J'ai un UpdatePanel avec un GridView à l'intérieur.
Le Gridview a une TemplateColumn ayant un lien hypertexte.
En utilisant jQuery au début de la page, je mets tous ces liens pour devenir des hyperliens modal nyroModal. C'est à dire. donc quand vous cliquez dessus, la page cible est chargée dans un dialogue modal. Ce code est:
<script type="text/javascript">
$(document).ready(function(){
$(".modal").nyroModal();
});
</script>
Si je retire le UpdatePanel, le code nyroModal ci-dessus fonctionne parfaitement bien. Mais avec l'UpdatePanel là, il enfourne les appels nyroModal et ouvre les liens que les fenêtres de toutes nouvelles premières / onglets dans Firefox. Le UpdatePanel essaie d'être trop intelligent et lancer un postback etc.
Dois-je inscrire en quelque sorte l'appel nyroModal pour chaque bouton au moment du rendu ou quelque chose à dire .Net / UpdatePanel pour « rester loin l'enfer »? J'ai joué un peu avec RegisterClientScriptBlock etc mais ne peut pas sembler pour le rendre heureux. Il semble que ce tracas pour enregistrer script côté client avec le code côté serveur .Net. Je trouve lourd et frustrant:)
Merci beaucoup pour toute suggestion ou idée.
La solution
essayez ceci:
<script type="text/javascript">
$(document).ready(function(){
/*
This binds a callback to the click event of all
elements with the 'modal' class, even ones that are
updated inside an UpdatePanel.
*/
$(".modal").live('click', function(){
/*
When the element is clicked, open the nyroModal dialog
manually. (If the element is a link, nyroModal will
automatically get the content based on the link's href attribute.)
*/
$(this).nyroModalManual();
});
});
</script>
Modifier
J'ai créé une page qui semble fonctionner très bien. Le code source complet est ci-dessous.
Remarque: Il y a une chose importante que je ne l'ai pas dans le code ci-dessus. J'ai oublié de prévenir le lien de réellement changer l'emplacement du navigateur, donc notez le dans le code evt.preventDefault();
ci-dessous (Désolé que: P).
<%@ Page Language="C#" %>
<script runat="server">
public void Page_Load()
{
BindGridViewUrls();
}
public void GridViewUrls_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridViewUrls.PageIndex = e.NewPageIndex;
BindGridViewUrls();
}
public void BindGridViewUrls() {
var Urls = new[]{
new {UrlText="Google", Url="http://google.com"},
new {UrlText="Stack Overflow", Url="http://stackoverflow.com"},
new {UrlText="XKCD", Url="http://xkcd.com"},
new {UrlText="Google Reader", Url="http://google.com/reader"},
new {UrlText="reddit", Url="http://reddit.com"},
new {UrlText="Hacker News", Url="http://news.ycombinator.com"},
new {UrlText="Ubuntu", Url="http://ubuntu.com"},
new {UrlText="Twitter", Url="http://twitter.com"},
new {UrlText="YouTube", Url="http://youtube.com"},
new {UrlText="Wikipedia", Url="http://en.wikipedia.org"},
new {UrlText="Coding Horror", Url="http://codinghorror.com"},
new {UrlText="Mozilla", Url="http://mozilla.org"},
new {UrlText="jQuery", Url="http://jquery.com"},
new {UrlText="NyroModal", Url="http://nyromodal.nyrodev.com/"},
};
GridViewUrls.DataSource = Urls;
GridViewUrls.DataBind();
}
</script>
<!DOCTYPE
html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>UpdatePanel Test</title>
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js">
</script>
<script src="jquery.nyroModal-1.4.2.js"></script>
<script>
$(function(){
$('.modal').live('click', function(evt){
$(this).nyroModalManual({minWidth:750});
evt.preventDefault();
});
});
</script>
</head>
<body>
<form runat="server">
<div>
<asp:ScriptManager runat="server">
</asp:ScriptManager>
<asp:UpdatePanel runat="server">
<ContentTemplate>
<asp:GridView runat="server" ID="GridViewUrls" AllowPaging="true"
PageSize="5" OnPageIndexChanging="GridViewUrls_PageIndexChanging">
<Columns>
<asp:HyperLinkField DataTextField="UrlText"
DataNavigateUrlFields="Url" ControlStyle-CssClass="modal"
/>
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
Autres conseils
Je vous suggère d'utiliser la boîte de dialogue de l'interface utilisateur jquery.
Reportez-vous cela pour comment l'utiliser: http://jqueryui.com/demos/dialog
Je l'ai mis en place quelque chose de semblable à ce que vous voulez en utilisant le dialogue et il fonctionne très bien.
Il vous suffit d'ajouter l'arrière de dialogue à la forme comme ceci:
jQuery(".modal").each(function() {
var popup = jQuery(this);
popup.parent().appendTo(jQuery("form:first"));
});