自定义 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');";
这可行,但远非最佳。
- 我想在 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()" />
有没有更好的方法?
谢谢。
this.Page.ClientScript.Register...
我在对原始问题的编辑中探索了两种可能的解决方案。第二次编辑达到了预期的效果。我想为自定义 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()" />
我构建了许多自定义服务器控件并定期调用嵌入到我的控件中的 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');";
这可行,但远非最佳。
- 我想在 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()" />
有没有更好的方法?
谢谢。
this.Page.ClientScript.Register...
我在对原始问题的编辑中探索了两种可能的解决方案。第二次编辑达到了预期的效果。我想为自定义 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()" />