簡體   English   中英

從 ASP.NET Webforms 中的頁面級別調用 UserControl 內部的客戶端函數

[英]Calling a client-side function that is inside of a UserControl from the Page level in ASP.NET Webforms

我有一個位於 ASP.NET 頁面內的 ASP.NET UserControl。

ASP.NET UserControl 具有以下正常工作的邏輯:

用戶控件中的按鈕:

<asp:LinkButton runat="server" ID="lbCalculate" Text="Calculate" OnClientClick="SaveGridData(); return false;"></asp:LinkButton>

這是調用的客戶端函數:(也在 UserControl 中)

function SaveGridData(sender, args) {
    var grid = $find('<%=grid1.ClientID%>');
        grid.get_batchEditingManager().saveChanges(grid.get_masterTableView());
    }

客戶端函數最終進入名為 grid1_BatchEditCommand 的服務器上的網格事件,該事件將所有數據保存在網格中(也在 UserControl 中)。


當單擊駐留在 UserControl 中的計算按鈕時,上述工作完美無缺。 但是,當單擊 UserControl 所在的頁面上的按鈕時,我還需要運行完全相同的邏輯。

我首先嘗試在名為 SaveGrid() 的用戶控件中公開一個公共函數,該函數具有一個調用 SaveGridData() 的 RegisterStartUpScript。 然后在 btnFromParentPage_OnClick 事件上我調用 SaveGrid()。 沒運氣。

public void SaveGrid()
{
    ScriptManager.RegisterStartupScript(Page, Page.GetType(), "test", "SaveGridData();", true);
}

在父頁面代碼后面:

protected void btnFromParentPage_Click(object sender, EventArgs e)
{
    userControl1.SaveGrid();
}

我還嘗試了以下作為最后的手段:
<asp:Button ID="btnOnParentPage" runat="server" SkinID="Success" Text="Save & Close" OnClick="btnOnParentPage_Click" OnClientClick="SaveGridData(); return false;" />

JavaScript 函數被調用並且它可以工作,但是現在我無法訪問此按鈕的 OnClick 服務器端事件,因為返回假行並且沒有返回假行,JavaScript 函數不會被調用......那里還有更多的邏輯需要運行。

您可以簡單地向上或向下導航控件樹以找到控件並獲取它的ClientID

var grid = $find('<%= userControl1.FindControl("grid1").ClientID %>');

為此,用戶控件必須在 aspx 頁面上定義,而不是從后面的代碼中動態添加。 如果它是從后面的代碼中添加的,那么您還必須以編程方式獲取 ClientID 並將其作為字符串放在頁面上。

JavaScript 函數和變量都是公開的(除非你將它們括起來),所以你的SaveGridData()函數已經可以被整個頁面訪問,無需任何額外的代碼。 頁面上的另一個按鈕可以使用與用於計算按鈕的相同代碼輕松訪問它:

<asp:LinkButton runat="server" ID="btnFromParentPage" Text="Save & Close"
 OnClientClick="SaveGridData(); return false;"></asp:LinkButton>

編輯:如果您想在 JavaScript 函數之后運行服務器代碼,只需刪除return false

<asp:LinkButton runat="server" ID="btnFromParentPage" Text="Save & Close"
 OnClientClick="SaveGridData();"></asp:LinkButton>

對不起,如果我的問題誤導了人們,但主要問題與以下事實有關:

grid.get_batchEditingManager().saveChanges(grid.get_masterTableView());

在 SaveGridData() 中調用頁面上網格控件的服務器端事件。 當您還嘗試同時進入按鈕單擊服務器端事件時,這不起作用。

解決方案:
在 UserControl 中的 UserControl grid1_BatchEditCommand 服務器端事件函數的末尾公開一個事件。 然后從父頁面點擊此事件。 需要運行的父頁面上按鈕的附加邏輯現在只在事件內部運行,而不是 btnOnParentPage_Click。

這是流程:

  1. btnOnParentPage 被單擊,它只調用 UserControl 中的客戶端函數 SaveGridData()。

  2. 這會調用在服務器上運行 grid1_BatchEditCommand 事件(它起作用是因為沒有同時調用其他服務器端事件)

  3. 然后在 BatchEditCommand 代碼的底部是我公開的新事件。 此事件內的父頁面上的代碼(我最初在 btnOnParentPage_Click 中擁有)現在運行。

我有類似的情況,可以分享代碼嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM