代码之家  ›  专栏  ›  技术社区  ›  Aristos

控件属性呈现在点NET 4上编码-如何禁用编码?

  •  3
  • Aristos  · 技术社区  · 16 年前

    我在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) 函数,

    每个属性都有一个标志,如果他想被编码的话,但是我不知道如何设置它。

    一个工作

    In the asp net forum 在同一个问题中,有一个解决方案可以改变全局编码类型-这不是我搜索的解决方案-给出解决方案的人说 这不是一个很好的解决方法 存在潜在的安全问题或其他呈现问题。

    提前谢谢大家。

    科尔文

    到目前为止,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 回复  |  直到 13 年前
        1
  •  1
  •   kervin    15 年前

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

    注释

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

    问题是 属性 如果在代码隐藏中设置,则需要数据。

    解决方法是发送回 client script 使用客户端处理程序函数,可以使用函数名设置属性。

    如果您的javascript是静态的,那么事情就更简单了,因为您可以在 脚本 在控件注册之前标记。

        2
  •  2
  •   bwarner    15 年前

    你试过用吗 this new ASP.NET 4 feature 定制编码器?

        3
  •  1
  •   Andrew Csontos    14 年前

    我在使用mvchtmlHelper进行自动完成时遇到了这个问题。

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

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

        4
  •  0
  •   Martyn    13 年前

    如果您真的想阻止参数编码,您需要创建自己的自定义控件并重写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,则可能会产生干扰。如果您想进一步了解这一点,可以迭代实际的属性集合,并以这种方式添加它们。