2017-05-26 2 views
0

Ich habe kämpfen mit einer Steuerung im Master-Seite von einem Web-Methode (oder jede statische Methode in diesem Fall) zugreift.zugreifenden Master Seitensteuerung von WebMthod

Ich habe ein Bootstrap-styled Drop-Down-Menü in der Masterseite, das die Favoriten des Benutzers auflistet. Die Elemente in dieser Dropdown-Liste werden mit einem Repeater gefüllt, der die Liste der Favoriten für den aktuellen Benutzer aus der Datenbank liest und die Dropdown-Liste auffüllt.

Auf der Hauptseite, die diese Masterseite verwendet, gibt es eine Reihe von Berichten mit einer Schaltfläche "Zu Favoriten hinzufügen". Um diese Client-Seite zu machen, habe ich ein onclick-Ereignis zur Schaltfläche hinzugefügt, es ruft eine Javascript-Funktion auf, die eine Web-Methode aufruft, um diese Information (Benutzer-ID, URL) in der Datenbank zu speichern. Dieser Teil ist in Ordnung. Das Problem ist, dass ich dann das Dropdown aktualisieren muss (binden Sie den Repeater). Hier

ist, was ich habe und was ich versucht habe:

In Master-Seite:

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.Master.cs" Inherits="EA.SiteMaster" %> 
.... 
<asp:ScriptManager runat="server" ID="ScriptManager1" EnablePageMethods="true" /> 
.... 
<ul class="dropdown-menu" role="menu"> 
    <asp:Repeater runat="server" ID="rptFavorites" OnItemDataBound="rptFavorites_ItemDataBound"> 
     <ItemTemplate> 
      <li> 
       <asp:LinkButton runat="server" ID="lbFavLink" /><span class="glyphicon glyphicon-heart"></span> 
      </li> 
     </ItemTemplate> 
    </asp:Repeater> 
</ul> 

in Default.aspx:

<%@ Page Title="Home Page" Language="C#" MasterPageFile="Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="EA._Default" %> 
<%@ MasterType virtualpath="Site.master" %> 
.... 
function addFavorite(sURL, sFriendlyName) { 
    // I added this to get the routing working properly 
    var path = PageMethods.get_path() + '.aspx'; 

    PageMethods.set_path(path); 
    PageMethods.AddUserFavorite(sURL, sFriendlyName, onSucceeded, onFailed); 
} 
function onSucceeded(result, userContext, methodName) { 
    alert(result); 
} 
function onFailed(result, userContext, methodName) { 
    alert(result); 
} 
.... 
<button type="button" class="btn btn-primary btn-xs" id="btnMPP" onclick="addFavorite('http://blahblah.com/IV/SomeReport.html','Some Report')" ><i class="fa fa-heart-o" aria-hidden="true"></i></button> 

in Default.aspx.cs:

[System.Web.Services.WebMethod] 
public static string AddUserFavorite(string sURL, string sFriendlyName) 
{ 
    string sMsg = string.Empty; 
    string sUserID = HttpContext.Current.Session["UserID"].ToString(); 
    Favorites oFavorite = new Favorites(); 
    oFavorite.FavoritesURL = sURL; 
    oFavorite.FavoritesFriendlyName = sFriendlyName; 
    oFavorite.UserID = sUserID; 

    int iRet = Favorites.AddFavrites(oFavorite); 

    if (-1 == iRet) 
     sMsg = "Failed to add to favorites list"; 
    else 
    { 
     sMsg = "\"" + sFriendlyName + "\" (" + sURL + ") was added to your favorites list"; 
     UpdateMaster(); 
    } 
    return sMsg; 
} 

private static void UpdateMaster() 
{ 
    Page page = (Page)HttpContext.Current.Handler; 
    MasterPage mp = page.Master; <--- Always null 

    Repeater rptFavorites = mp.FindControl("rptFavorites") as Repeater; 

    if (rptFavorites != null) 
    { 
     // rebind repeater here 
    } 
} 

Alle Ideen, wie ich kann dies erreichen wird sehr geschätzt. Natürlich kann ich die "Add to Favorites" zu einem ASP LinkButton ändern und keine Probleme, sondern muss nur wissen, wie dieser Ansatz durchgeführt werden kann; wenn es möglich ist.

Antwort

0

Ich glaube nicht, dass Sie diesen Code benötigen, um auf Ihren Repeater zuzugreifen.

Page page = (Page)HttpContext.Current.Handler; 
MasterPage mp = page.Master; <--- Always null 

Sie müssen es nur sagen, um es in der MasterPage zu suchen. Versuchen Sie es so.

(Repeater) rpt = (Repeater) Master.FindControl("rptFavorites"); 
+0

Funktioniert nicht. Das war mein allererster Versuch. Auf die Steuerelemente kann nicht über die statische Methode zugegriffen werden. Wenn Sie eine Methode aufrufen, die in einer Benutzerklasse definiert ist, können Sie eine Instanz der Klasse über die Webmethode erstellen und dann die Funktion aufrufen. aber ich benutze keine Klasse. – NoBullMan

+0

Weitere Untersuchungen zu diesem Thema, ich habe gerade herausgefunden, dass Sie nicht können. Wie diese Diskussion hat. https://stackoverflow.com/questions/31514188/how-to-access-page-controls-inside-a-static-web-method Ich wünschte nur, ich könnte mehr hilfreich. – jmag

+0

OK, danke für den Versuch zu helfen. – NoBullMan

Verwandte Themen