【问题标题】:Custom ASP.Net Server Controls: How to call javascript function in parent page自定义 ASP.Net 服务器控件:如何在父页面中调用 javascript 函数
【发布时间】:2016-12-01 20:59:15
【问题描述】:

我已经构建了许多自定义服务器控件并定期调用嵌入到我的控件中的 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是控件中的私有字符串变量)

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()" />

有更好的方法吗?

谢谢。

【问题讨论】:

    标签: javascript c# asp.net custom-server-controls


    【解决方案1】:

    this.Page.ClientScript.Register...

    https://msdn.microsoft.com/en-us/library/ms178207.aspx

    【讨论】:

    • 谢谢,@h2015。我以前使用过这一系列方法,但它们似乎不是解决这个问题的方法。我进一步研究了它们,并为我原来的问题添加了一个可行的解决方案。
    【解决方案2】:

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

    将公共字符串属性添加到定义 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()" />
    

    【讨论】:

      猜你喜欢
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 2011-08-09
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多