簡體   English   中英

自定義ASP.Net服務器控件:如何在父頁面中調用javascript函數

[英]Custom ASP.Net Server Controls: How to call javascript function in parent page

我建立了許多自定義服務器控件,並定期調用嵌入到控件中的javascript函數。 但是我還無法弄清楚如何創建控件的用戶可以向其添加自己的函數的屬性,並且將在包含該控件的頁面中調用其javascript函數。 我需要為asp:Button控件執行類似OnClientClick的操作。

編輯1:

感謝@ h2015的回答,我在此方面取得了進展。

在我的控件中,我為用戶的腳本創建了一個公共屬性,

public string EditAddressScript
{
  set
  {
    string scriptName = "EditAddressScript";
    Type csType = this.GetType();
    ClientScriptManager csm = Page.ClientScript;

    string scriptText = string.Format("function EditAddress() {{{0}}}", value);

    csm.RegisterClientScriptBlock(csType, scriptName, scriptText, true);
  }
}

然后,在控件的RenderContents部分中,檢查是否已為EditAddressScript指定一個值,並創建一個按鈕(如果有)。

output.Write("<input id='btnEdit' type='button' value='Edit Address' style='font-size: 6pt;' onclick='EditAddress();' />");

使用此控件的頁面會動態創建它,因此我要做類似的事情,

ECFControls.DefendantAddressReview defendantAddress = new ECFControls.DefendantAddressReview();
divControls.Controls.Add(defendantAddress);
defendantAddress.ClientEditAddressScript = "alert('Hello, World');";

這可行,但遠非最佳。

  • 我想在aspx頁面中定義腳本,然后只為控件提供腳本的名稱,而不是將EditAddressScript的值設置為實際的javascript代碼。
  • 在控件的RenderContents部分,我將腳本的名稱進行了硬編碼,我希望它是動態的。

編輯2:

好的,看來我使這一過程變得比必要的復雜得多。 所需要做的只是在父aspx頁中創建腳本並將控件中的事件設置為該腳本。

所以這就是我現在所擁有的

將腳本添加到aspx頁面。

    function EditAddress() {
      alert("Hello, World");
    }

在控件中創建一個屬性以保存值( _EditAddressScript_EditAddressScript中的私有字符串變量)

public string EditAddressScript
{
  set
  {
    _EditAddressScript = value;
  }
}

然后,在控件的RenderContents部分中,檢查是否已為EditAddressScript指定一個值,並創建一個按鈕(如果有)。

        if(_EditAddressScript.Trim() != "")
          output.Write(string.Format("<input id='btnEdit' type='button' value='Edit' style='font-size: 6pt;' onclick='{0}' />", _EditAddressScript));

這樣創建控件,

    ECFControls.DefendantAddressReview defendantAddress = new ECFControls.DefendantAddressReview();
    divControls.Controls.Add(defendantAddress);
    defendantAddress.EditAddressScript = "EditAddress()";

如果以聲明方式創建控件,則可以執行此操作,

      <ECF:DefendantAddressReview ID="defendantAddressReview" runat="server" EditAddressScript="EditAddress()" />

有沒有更好的方法?

謝謝。

this.Page.ClientScript.Register ...

https://msdn.microsoft.com/zh-CN/library/ms178207.aspx

我在對原始問題的編輯中探討了兩種可能的解決方案。 第二次編輯獲得所需的結果。 我想為自定義ASP.Net服務器控件提供一個可選屬性,該屬性指定一個JavaScript函數的名稱,該控件的用戶可以將其與該控件放置在同一頁面中。 這是我的方法。

將公共字符串屬性添加到服務器控件,該屬性定義javascript函數的名稱。 _CustomJavascript_CustomJavascript中的私有字符串變量)

public string CustomJavascript
{
  set
  {
    _CustomJavascript = value;
  }
}

然后,在控件的RenderContents部分中,檢查是否已為_CustomJavascript指定值,並添加代碼以調用該javascript(如果已指定)。 以我為例,我正在創建一個復合控件,並希望顯示一個編輯按鈕來調用用戶的javascript函數。

if(_CustomJavascript.Trim() != "")
      output.Write(string.Format("<input id='btnEdit' type='button' value='Edit' style='font-size: 6pt;' onclick='{0}' />", _CustomJavascript));

用戶要做的就是編寫他們的功能。

function EditAddress() {
  alert("Hello, World");
}

聲明控件時,將其函數的名稱賦予CustomJavascript屬性。

  <cc:AddressReview ID="addressReview" runat="server" CustomJavascript="EditAddress()" />

暫無
暫無

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

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