从WebMthod

时间:2017-05-26 14:21:23

标签: c# asp.net .net-4.0 master-pages webmethod

我一直在努力从Web方法(或任何静态方法)访问母版页中的控件。

我在主页面中有一个引导样式的下拉列表,列出了用户的收藏夹。此下拉列表中的项目使用转发器填充,该转发器从DB读取当前用户的收藏列表并填充下拉列表。

在使用此母版页的主页上,有许多报告带有"添加到收藏夹"按钮。为了做到这个客户端,我在按钮上添加了一个onclick事件,它调用了一个调用web方法的javascript函数来将这个信息(用户ID,URL)存储在数据库中。这部分很好。问题是我需要更新下拉列表(重新绑定转发器)。

以下是我拥有的和我尝试过的内容:

在母版页中:

<%@ 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>
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>

在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
    }
}

非常感谢有关如何实现这一目标的任何想法。当然,我可以更改&#34;添加到收藏夹&#34;到一个ASP LinkBut​​ton并没有问题,但只需要知道如何做到这一点;如果可以的话。

1 个答案:

答案 0 :(得分:0)

我认为您不需要此代码来访问转发器。

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

您只需要告诉它在MasterPage中查找它。 试试这种方式。

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