控制属性渲染在dot net 4上编码 - 如何禁用编码?

时间:2010-05-26 11:22:37

标签: asp.net controls attributes asp.net-4.0

我在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");

我还找到了此属性呈现并且在

上的点

public virtual void RenderBeginTag(HtmlTextWriterTag tagKey)功能,

如果他希望编码,每个属性都有一个标志,但我不知道是否有人可以设置它。

一个工作

In the asp net forum 在同一个问题中,有一个改变全局EncodeType的解决方案 - 这不是我搜索的解决方案 - 并且提供解决方案的人说这不是一个好的解决方法,存在潜在的安全问题或其他渲染问题。

先谢谢大家。

由Kervin

到目前为止,Kervin发现Microsoft建议改为使用此命令。

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 个答案:

答案 0 :(得分:2)

您是否尝试过使用this new ASP.NET 4 feature 制作自定义编码器?

答案 1 :(得分:1)

来自MSDN WebControl.Attributes Property文档......

  

注意

     

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

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

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

如果你的javascript是静态的,那么事情甚至更简单,因为你可以在注册控件之前很久就用脚本标签发送它们。

答案 2 :(得分:1)

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

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

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

答案 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集合并以这种方式添加它们。