ASP.NET单引号被转换为'

12

注意:很可能这将是一个重复的问题,但因为我没有找到明确的答案,所以仍然提出了这个问题。

在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> 

让我特别烦恼的是,单引号'会自动转换为'&#39;'。如果我在标记中省略onclick并在Page_Load中分配它,则HTML中显示完全相同的结果。

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

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


2
为什么这很重要呢?虽然它们不是必需的,但这是有效的HTML并且可以正常工作。 - Matthew Flaschen
6个回答

7
我们在将一个项目从.NET 3.5迁移到.NET 4.0时,遇到了单引号在属性值中的相同问题。它会将所有属性值中的单引号转换为&39;。因此,我们回到了.NET 3.5。
这是一个.NET 4.0的问题。您可以在这里了解更多信息。

1
首先,asp 复选框控件不接受 onclick 作为有效属性。
所以你有两个选择:
1- 如果你不需要服务器端的值,你可以使用普通复选框代替 asp 复选框。
2- 如果你需要服务器端的值,请添加 runat="server" 属性并给你的复选框命名 ID,这样你就可以在代码中引用它。
<input type="checkbox" id="chk1" onclick="alert('hello');" runat="server" />

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; }
}

0

我曾经遇到过同样的问题。我进行了大量搜索,最终通过将页面内容类型更改为application/xhtml+xm解决了它。

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

希望这些信息能对您有所帮助。


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 + ")");

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接