我的aspx中有以下内容。
<html>
<body>
<input id="but" type="button" value="ClickMe" />
</body>
</html>
背后的代码
//Pageload
but.Attributes.Add("onclick", "this.parentNode.innerHTML += '<a id=""link"" href=""mylink""></a>';document.getElementById(""link"").click();");
渲染html
<input name="ctl00$Content$btn" type="button" id="ctl00_Content_btn" value="ClickMe"
onclick="this.parentNode.innerHTML += '<a id="link" href="mylink"></a>';document.getElementById("link").click();" />
如何才能正确呈现<
>
"
个字符?
答案 0 :(得分:4)
如果没有编码,则无法呈现这些字符。
来自MSDN
您无法使用。将客户端脚本添加到WebControl实例 属性集合。要添加客户端脚本,请使用ClientScript 页面控件上的属性。
如果你坚持,只需渲染你自己的控制。
答案 1 :(得分:3)
感谢Aristos,这很有效。
Page.ClientScript.RegisterStartupScript(Me.GetType(), "butClick", "function butClick() {this.parentNode.innerHTML += '<a id=""link"" href=""mylink""></a>';document.getElementById(""link"").click();}")
but.Attributes.Add("onclick", "butClick();");
答案 2 :(得分:0)
覆盖控件的Render方法并添加以下行:
base.Attributes.Add("onclick", Page.ClientScript.GetPostBackEventReference(new PostBackOptions(this, string.Empty)));
在页面上它应该呈现为:
onclick="__doPostBack('ctl00$ctl00$PageContent$LocalContents$button_id', '')"
哪个IE应该理解为回发引用,因此它不应该对其进行编码。 .Net应该与你的服务器端事件处理程序匹配
答案 3 :(得分:0)
如果您确实想要阻止参数编码,则需要创建自己的自定义控件并覆盖AddAttributesToRender方法。显然这不是很灵活,因为你需要为你使用的每种控件创建一个单独的自定义控件。
幸运的是,这很简单,只需要几行代码就可以了。 以下是自定义按钮所需的完整代码:
public class MyCustomButton : Button
{
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);
writer.AddAttribute("onclick", "myJavascriptFunction('a string');", false); // passing false to the AddAttribute method tells it not to encode this attribute.
}
}
显然,这只会在属性的末尾添加硬编码的onclick,如果已经提供了onclick,则可能会发生干扰。如果你想更进一步,你可以迭代实际的Attributes集合并以这种方式添加它们。
答案 4 :(得分:-1)
.net 4.0具有内置功能。 http://msdn.microsoft.com/en-us/library/system.web.httputility.javascriptstringencode.aspx - 来自文档。