自定义 ASP.Net 服务器控件:如何在父页面中调用 javascript 函数

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

我构建了许多自定义服务器控件并定期调用嵌入到我的控件中的 javascript 函数。但我一直无法弄清楚如何创建一个 属性 控件的用户可以添加他们自己的功能,并且将调用包含该控件的页面中的 javascript 功能。我需要为 asp:Button 控件做类似 OnClientClick 的操作。

编辑 1:

感谢@h2015 的回答,我在这方面取得了进展。

在我的控制下我为用户的脚本创建了一个public属性,

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');";

这可行,但远非最佳。

编辑 2:

好吧,看来我把这件事变得比必要的复杂得多了。所需要的只是在父 aspx 页面中创建一个脚本并将控件中的事件设置为该脚本。

这就是我现在拥有的

将脚本添加到 aspx 页面。

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

在控件中创建一个属性来保存值(_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/en-us/library/ms178207.aspx

我在对原始问题的编辑中探索了两种可能的解决方案。第二次编辑达到了预期的效果。我想为自定义 ASP.Net 服务器控件提供一个可选的 属性,它将指定 javascript 函数的名称,控件的用户可以将其放置在与控件相同的页面中。这是我的做法。

将 public 字符串 属性 添加到定义 javascript 函数名称的服务器控件。 (_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()" />