Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止代码隐藏中属性的HTML编码?_C#_Asp.net_Vb.net_.net 2.0 - Fatal编程技术网

C# 如何防止代码隐藏中属性的HTML编码?

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"

我的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();");
//页面加载
但是.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 += '&lt;a id=&quot;link&quot; href=&quot;mylink&quot;>&lt;/a>';document.getElementById(&quot;link&quot;).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标记行上。