3

我在 asp.net 4 中有一个问题。

当我在控件上添加一个属性时,然后对其进行编码。

例如,当我键入此代码时

txtQuestion.Attributes["onfocus"] = 
    "if(this.value == this.title)
{
   this.value = '';
   this.style.backgroundColor='#FEFDE0';
   this.style.color='#000000';
}";

我得到渲染

onfocus="if(this.value == this.title){this.value = 
'';this.style.backgroundColor='#FEFDE0';
this.style.color='#000000';}"

并且每个'哈希都更改为& #39;

有没有办法只在某些控件上禁用这个新的未来?还是制作自定义渲染的简单方法?

我的失败尝试

我已经准备好尝试一些想法,但我失败了。例如,这失败了。

txtQuestion.RenderingCompatibility = new Version("3.5");

我还找到了此属性呈现并打开的点

公共虚拟 void RenderBeginTag(HtmlTextWriterTag tagKey)函数,

如果他希望被编码,每个属性都有一个标志,但我不知道任何人如何设置它。

一项工作

在同一个问题的 asp net 论坛中,有一个解决方案可以更改全局 EncodeType - 这不是我要搜索的解决方案 - 提供解决方案的人说这不是一个很好的解决方法,存在潜在的安全问题或其他渲染问题。

先谢谢大家了。

通过凯文

直到现在,Kervin 才发现微软建议改用这个命令。

txtQuestion.Attributes["onfocus"] = 
    "if(this.value == this.title){this.value = '';this.style.backgroundColor='#FEFDE0';this.style.color='#000000';}";

使用这个。

    Page.ClientScript.RegisterExpandoAttribute(txtQuestion.ClientID, "onfocus", 
 "if(this.value == this.title){this.value = '';this.style.backgroundColor='#FEFDE0';this.style.color='#000000';}");

而 MS 呈现的是页面末尾,一个使用 JavaScript 将 onfocus 添加到此控件的脚本。我们甚至可以自己使用 jQuery 来做到这一点,而且可能更兼容。

这是一个解决方案,但我仍然想知道是否有一种方法可以避免属性编码,让我按照自己的方式做- 而不是 MS 方式。

4

4 回答 4

2

您是否尝试过使用这个新的 ASP.NET 4 功能 来制作自定义编码器?

于 2010-06-02T14:37:18.363 回答
1

从 MSDN WebControl.Attributes 属性文档...

笔记

您不能使用 Attributes 集合将客户端脚本添加到 WebControl 实例。要添加客户端脚本,请使用 Page 控件上的 ClientScript 属性。

问题是Attributes需要数据,如果它是在代码隐藏中设置的。

解决方案是使用您的客户端处理程序函数发回客户端脚本,然后您可以使用函数名称设置属性。

如果您的 javascript 是静态的,那么事情就更简单了,因为您可以在控件注册之前很久就将它们发送到脚本标记中。

于 2010-06-05T22:21:07.033 回答
1

我使用 MvcHtmlHelper 自动完成时遇到了这个问题。

我最终使用了|~| 而不是 ',然后在 Html.TextBox 呈现字符串之后,但在我们返回它之前,用 ' 替换它。

这是一个非常烦人的“安全”功能。

于 2011-10-05T13:42:27.013 回答
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 集合并以这种方式添加它们。

于 2013-03-26T16:25:25.930 回答