如何防止代码中的属性的HTML编码?

时间:2011-07-27 22:36:46

标签: 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""></a>';document.getElementById(""link"").click();");

渲染html

<input name="ctl00$Content$btn" type="button" id="ctl00_Content_btn" value="ClickMe" 
onclick="this.parentNode.innerHTML += '&lt;a id=&quot;link&quot; href=&quot;mylink&quot;>&lt;/a>';document.getElementById(&quot;link&quot;).click();" />

如何才能正确呈现< > "个字符?

5 个答案:

答案 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)