2010-06-10 43 views
8

Nota: Probablemente esta sea una pregunta doble, pero como no he encontrado una respuesta clara, la estoy preguntando de todos modos.Las comillas simples de ASP.NET se convierten a '

En ASP.NET me gustaría agregar algo de JavaScript al evento onclick de un CheckBox. He simplificado el caso a esto:

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

El HTML resultante es el siguiente:

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

Lo que más me molesta es que una comilla simple 'automáticamente' se convierte en '& # 39; '. Si omito el onclick en el marcado y lo asigno en Page_Load, los mismos resultados exactamente se muestran en el HTML.

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

¿Alguien tiene una pista sobre lo que está pasando? ¿O cómo solucionarlo/evitarlo?

+2

¿Por qué es importante? No son necesarios, pero es HTML válido y funciona bien. –

Respuesta

1

En caso de que alguien encuentra esta pregunta, esta es la forma en que fue capaz de inyectar atributos de un control personalizado sin tener los valores codificados HTML. Este es un ejemplo de un botón que llama a una función asíncrona para confirmar una acción de presionar un botón.

La clave es utilizar el escritor.AddAttribute() que tiene el indicador para deshabilitar el paso HTMLEncode. Esto también parece depender de la versión de asp.net que esté utilizando. esto funciona en .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; } 
} 
1

En primer lugar, el control de casilla de verificación asp no toma onclick como un atributo válido.

Por lo que puede hacer dos cosas:

1- Si usted no necesita el servidor del lado del valor, sólo puede poner una casilla de verificación normal en lugar de la casilla de verificación asp.

2- Si necesita el lado del valor del servidor, agregue el atributo runat = "server" y coloque e ID en su casilla de verificación para que pueda hacer referencia a él en su código.

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

Tuvimos el mismo problema con comillas simples en los valores de atributo cuando migramos un proyecto de .NET 3.5 a .NET 4.0. Convierte todas las comillas simples en valores de atributo en &39;. Así que volvimos a .NET 3.5.

Es cosa de .NET 4.0. Puede leer más sobre este tema here.

+0

Gracias! Eso lo aclara un poco más. –

0

Me encontré con este recientemente donde se estaba actualizando un control después de que se hubiera realizado la conexión de datos. La solución fue añadir el Javascript onchange durante el evento del servidor OnItemDataBound para el repetidor involucrados:

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

que estaba enfrentando mismo problema. Busqué mucho, finalmente lo resolví cambiando el tipo de contenido de la página a application/xhtml + xm.

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

Esperanza, esta información le ayudará a ..

Cuestiones relacionadas