C# 如何防止代码隐藏中属性的HTML编码?
我的aspx中有以下内容C# 如何防止代码隐藏中属性的HTML编码?,c#,asp.net,vb.net,.net-2.0,C#,Asp.net,Vb.net,.net 2.0,我的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"
<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();");
//页面加载
但是.Attributes.Add(“onclick”,“this.parentNode.innerHTML+=”;document.getElementById(“link”)。单击();”;
呈现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();" />
如何使
“
字符正确渲染?如果不进行编码,则无法渲染这些字符
从
无法使用将客户端脚本添加到WebControl实例
属性集合。若要添加客户端脚本,请使用
页控件上的属性
如果您坚持,只需渲染您自己的控件。覆盖控件的渲染方法并添加以下行:
base.Attributes.Add("onclick", Page.ClientScript.GetPostBackEventReference(new PostBackOptions(this, string.Empty)));
在页面上,它应呈现为:
onclick="__doPostBack('ctl00$ctl00$PageContent$LocalContents$button_id', '')"
哪个IE应该理解为回发引用,所以它不应该对它进行编码..Net应该将它与服务器端事件处理程序匹配起来谢谢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();");
Page.ClientScript.RegisterStartupScript(Me.GetType(),“butClick”,“function butClick(){this.parentNode.innerHTML+=”;document.getElementById(““link”)。click();})
添加(“onclick”,“butClick();”;
.net 4.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,则可能会产生干扰。如果您想更进一步,可以迭代实际的属性集合并以这种方式添加它们。对于此项目,我被困在.net 2.0中。请使用reflector或ilspy。Reflect the system.web汇编。从那里窃取代码。在2.0中实现它。如果您有困难,请告诉我们。:)他们这么说很有趣。在示例中,再往下几行,他们完全按照他们说的不做。@DJA他们没有说不做。他们说,如果您这样做,字符将被编码在html标记行上。