2011-08-11 3 views
2

J'ai un UpdatePanel qui a un gridview à l'intérieur. Sur chacun des gridviewrows, dans le gridview, j'ai un bouton Twitter et FaceBook. Le gridview rend très bien avec les boutons sur le chargement de la page, cependant, une fois qu'une publication partielle est effectuée sur le panneau de mise à jour les boutons Twitter et FaceBook ne rendent pas.Boutons .NET UpdatePanel et FaceBook/Twitter

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
<!-- search controls.... --> 
<asp:ImageButton ID="btnSearch" ImageUrl="~/img/button-search.gif" runat="server" /> 

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" EnableModelValidation="True" 
       BorderStyle="None" Font-Size="Small" GridLines="None" AllowPaging="True" ShowFooter="True" 
       Width="100%" OnPageIndexChanging="GridView1_PageIndexChanging"> 
       <RowStyle CssClass="row1" /> 
       <AlternatingRowStyle CssClass="row2" /> 
       <Columns> 
        <asp:TemplateField> 
         <ItemTemplate> 
          ... 
        <asp:TemplateField> 
         <ItemTemplate> 
          <asp:Literal ID="ltlTwitter" runat="server" Text='<%# GetTwitterURL(Eval("ID"), Eval("SomeText")) %>'></asp:Literal> 
         </ItemTemplate> 
        </asp:TemplateField> 
        <asp:TemplateField> 
         <ItemTemplate> 
          <asp:Literal ID="ltlFacebook" runat="server" Text='<%# GetFacebookURL(Eval("ID")) %>'></asp:Literal> 
         </ItemTemplate> 
        </asp:TemplateField> 
        <asp:BoundField DataField="ID" HeaderText="ID" SortExpression="ID" Visible="False" /> 
       </Columns> 
       <EmptyDataTemplate> 
        <strong>There are no offers for this search criteria.</strong> 
       </EmptyDataTemplate> 
      </asp:GridView> 
</ContentTemplate> 
     <Triggers> 
      <asp:PostBackTrigger ControlID="btnSearch" /> 
     </Triggers> 
    </asp:UpdatePanel> 

pertinente C#:

public static string GetTwitterURL(object ID, object text) 
{ 
    ...   
    StringBuilder sb = new StringBuilder(); 
    sb.Append("<div>"); 
    sb.Append("<a href=\"http://twitter.com/share\" " + 
     "class=\"twitter-share-button\" "); 
    sb.AppendFormat("data-url=\"{0}?ID={1}\" ", obj.Property, oID.ToString()); 
    sb.Append("data-via=\"xxx\" "); 
    sb.AppendFormat("data-text=\"{0}\"", xxx); 
    sb.Append("data-count=\"none\">Tweet</a>"); 

    sb.Append("</div>"); 

    return sb.ToString(); 

} 

public static string GetFacebookURL(object OfferID) 
{ 
    ... 

    return string.Format("<fb:like href=\"{0}?ID={1}\" " + 
     "send=\"false\" layout=\"button_count\" show_faces=\"false\" " + 
     "action=\"like\" font=\"tahoma\"></fb:like>", obj.Property, someInt); 
} 

En outre, la page en question est une page enfant d'une page maître.

Voici le code-behind supplémentaires:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     this.BindOffersGrid(true); 
    } 
} 

public List<Offer> CurrentOffersDataSet 
{ 
    get 
    { 
     object o = ViewState["CurrentOfferDataSet"]; 
     return (o == null ? new List<Offer>() : (List<Offer>)o); 
    } 
    set 
    { 
     ViewState["CurrentOfferDataSet"] = value; 
    } 
} 

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 
    GridView1.PageIndex = e.NewPageIndex; 
    GridView1.DataSource = this.CurrentOffersDataSet; 
    GridView1.DataBind(); 
} 

private void BindOffersGrid(bool ApplyRandomSort) 
{ 
    List<Offer> lstOffers = Offers.GetAllBySearchCriteria(
     Convert.ToInt32(ddlOfferCounty.SelectedValue), 
     Convert.ToInt32(ddlOfferTypes.SelectedValue), 
     Convert.ToDateTime(ddlOfferDate.SelectedValue), -1, true); 

    ... 
    //Some filtering of the dataset with Linq 
    ... 

    GridView1.DataSourceID = string.Empty; 
    this.CurrentOffersDataSet = lstFilteredOffers. 
     OrderByDescending(a => a.IsExclusive). 
     ThenBy(a => Guid.NewGuid()). 
     ToList(); 
    GridView1.DataSource = this.CurrentOffersDataSet; 
    GridView1.DataBind(); 
} 
+0

Avez-vous essayé de les définir dans code-behind sur un événement lié à un élément? Il se peut que les appels de script en ligne ne soient pas entièrement compatibles, mais je ne suis pas sûr car j'ai tendance à rester loin de l'utilisation de tels que bien sûr. –

+0

@ Seany84: Il convient de noter que vous n'avez pas vraiment besoin d'un 'StringBuilder' pour la concaténation que vous faites dans la méthode' GetTwitterURL'; vous pouvez vous en servir en appelant 'string.Format' et en décomposant la chaîne en plusieurs concaténations sur plusieurs lignes. Le compilateur va concaténer ce qu'il peut au moment de la compilation, puis les opérations de concaténation appellent 'string.Concat' qui pré-détermine la taille de la valeur de retour, puis copie tous les éléments dans la chaîne renvoyée. – casperOne

+0

@casperOne Merci pour les conseils. – Seany84

Répondre

4

Ok, j'ai ajouté le code suivant à la fin de ma page enfant et maintenant le Twitter et Facebook comme le bouton apparaissent après postbacks partielles.

<script type="text/javascript"> 

     var prm = Sys.WebForms.PageRequestManager.getInstance(); 
     prm.add_pageLoaded(pageLoaded); 

     var _panels, _count; 

     function pageLoaded(sender, args) { 
      if (_panels != undefined && _panels.length > 0) { 
       for (i = 0; i < _panels.length; i++) 
        _panels[i].dispose(); 
      } 

      var panels = args.get_panelsUpdated(); 

      if (panels.length > 0) { 

       updateFbLike(); 
      } 
     } 

     function updateFbLike() { 
      $.getScript("http://platform.twitter.com/widgets.js"); 
      FB.XFBML.parse(); 
     } 


    </script>