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.
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
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
OK, danke für den Versuch zu helfen. – NoBullMan