ASP.NET单引号转换为'

时间:2010-06-10 11:27:18

标签: c# asp.net quotes

注意:这很可能是一个双重问题,但由于我没有找到明确的答案,无论如何我都会问它。

在ASP.NET中,我想在CheckBox的onclick事件中添加一些JavaScript。我简化了这个案例:

<asp:CheckBox ID="TestCheckBox" runat="server" onclick="alert('test');" Text="Test" />

生成的HTML如下:

<input id="MainContainer_TestCheckBox" type="checkbox" name="ctl00$MainContainer$TestCheckBox" onclick="alert(&#39;test&#39;);" /><label for="MainContainer_TestCheckBox">Test</label> 

特别困扰我的是,单个引号“自动”转换为“&amp;#39;”。如果我省略了标记中的onclick并在Page_Load中分配它,则HTML中会显示完全相同的结果。

protected void Page_Load(object sender, EventArgs e)
{
    this.TestCheckBox.Attributes["onclick"] = "alert('test');";
}

任何人都知道发生了什么?或者如何修复/避免它?

6 个答案:

答案 0 :(得分:7)

当我们将项目从.NET 3.5迁移到.NET 4.0时,我们在属性值中出现了与单引号相同的问题。它会将属性值中的所有单引号转换为&39;。所以我们回到了.NET 3.5。

这是一个.NET 4.0的东西。您可以阅读有关此问题的更多信息here

答案 1 :(得分:1)

首先,asp复选框控件不会将onclick作为有效属性。

所以你可以做两件事:

1-如果您不需要值服务器端,您可以只使用普通复选框而不是asp复选框。

2-如果您需要值服务器端,请在复选框中添加runat =“server”属性和位置和ID,以便在代码中引用它。

<input type="checkbox" id="chk1" onclick="alert('hello');" runat="server" />

答案 2 :(得分:1)

如果其他人发现了这个问题,这就是我能够从自定义控件中注入属性而不使用html值编码的方式。这是一个按钮的示例,该按钮调用异步功能以确认按钮按下操作。

关键是使用writer.AddAttribute(),它具有禁用HTMLEncode步骤的标志。这似乎也取决于您使用的是哪个版本的asp.net。这适用于.net 4.6.1

 public class ConfirmationLinkButton : LinkButton
{
    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {
        base.AddAttributesToRender(writer);
        string script = "confirmAsync('" + ConfirmationMessage.Replace("'", "\\'") + "', " + Callback() + ");" +
                        "return false;";
        writer.AddAttribute(HtmlTextWriterAttribute.Onclick, script, false);
    }

    private string Callback()
    {
        return "(data) => { if (data===true) {" + Page.ClientScript.GetPostBackEventReference(this, "") + "}}";
    }

    public string ConfirmationMessage { get; set; }
}

答案 3 :(得分:0)

我最近碰到了这个,在数据绑定发生后,控件正在更新。修复是在OnItemDatabound服务器事件期间为所涉及的转发器添加onchange javascript:

protected void rptTarifDetails_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item)
    {    TextBox proposedPrice = e.Item.FindControl("txtProposedUnitSell") as TextBox;
        proposedPrice.Attributes.Add("onchange", "CalcCommissionSingleLine(this,'None','" + ((Repeater)sender).ClientID + "', false, " + rowCount.Value + ")");

答案 4 :(得分:0)

我遇到了同样的问题。我搜索了很多,最后通过将页面的内容类型更改为application / xhtml + xm来解决它。

<%@ Page Language="C#" AutoEventWireup="true" EnableViewState="true" Debug="true" ContentType="application/xhtml+xm" %>

希望,这些信息可以帮助你..

答案 5 :(得分:0)

好吧,如果您想停止输入英格鲁报价 试试这个

onkeypress="if (event.keyCode==39) event.returnValue = false;"

<asp:TextBox ID="TextBox1" runat="server"   onkeypress="if (event.keyCode==39) event.returnValue = false;"
></asp:TextBox>