2011-02-11 7 views
16

Tengo un asp:ListView cuyo ClientIDMode se establece en Predecible. Its ItemTemplate contiene un asp:textbox.asp.net 4.0: ¿hay algún equivalente de ClientIDMode para los nombres de INPUT?

El ID de la caja de texto está actuando como espero que, pero su name sigue utilizando lo que parece ser un algoritmo de estilo AutoID:

<input name="lvFields$ctrl0$tbVal" id="lvFields_tbVal_somekey" type="text"/> 

¿Hay una manera para mí para hacer que el nombre de la entrada para actuar como lo hace la identificación?

(Edit en respuesta a preguntas a continuación :)

El Name del elemento de entrada es lo que hay en los datos POST, así que si una devolución de datos altera la lista a la que está unido el ListView (por ejemplo, el intercambio de dos elementos) los valores de los cuadros de texto terminan asociados con las claves incorrectas, porque el marco los correlaciona según el Name y no el ID.

+0

¿Por qué necesita el nombre para ser 'Predictable'? –

+1

Si ya tiene 'ID's que son' Predecibles', ¿por qué necesita que 'Nombre' sea también? – Oded

+1

¿Una razón podría ser si desea devolver el valor seleccionado de un conjunto de botones de opción en JavaScript? Si tiene un diseñador de JS/HTML y un programador de back-end, tal como está el programador debería entender que hacer referencia a los nombres de cualquier elemento DOM estaba fuera de los límites, porque esos nombres además de ser feos podrían cambiar inesperadamente. . –

Respuesta

0

Hasta donde yo sé, no hay forma de cambiar el nombre del elemento de entrada. El nombre corresponde a la propiedad UniqueID, que el sistema genera y sobre la que no tiene control. Parece que tienes que encontrar la manera de lograr lo que deseas utilizando solo la ID de control.

0

Ambos nombres usan el patrón predecible; originalmente, el nombre también era igual a ct100_ct100, etc. Por lo que veo, ese es un nombre predecible. El valor de Client ID siempre usará _ entre los prefijos de control y Unique ID (name attrib) siempre usará $. Los dos siempre coincidirán, a excepción de unos pocos controles que aprovechan el nombre para algo (la lista de botones de radio se usa para agrupar).

HTH.

0

Tuve exactamente el mismo problema una vez y tuve que usar una de estas propiedades expuestas en "System.Web.UI.Control" para obtener el nombre de control del lado del servidor.

jugar con estas propiedades y construir el "nombre" en el lado del servidor sí mismo y utilice Request.Form ("NameHere")

Me.ClientIDSeparator 
Me.IdSeparator 
Me.UniqueID 
1

Estoy bastante seguro de que no se puede cambiar el nombre, especialmente cuando modifica el ClientIDMode. Como alternativa, puede agregar un atributo de Título. VS lo marcará como desconocido en el código del lado del servidor, pero se representa correctamente en el HTML. Si estás haciendo una cierta manipulación del lado del cliente, se puede hacer frente a la entrada como tal:

<script type="text/javascript"> 
$(document).ready(function() { 
$('input:text[title="TextBoxName"]').datepicker(); 
}); 
</script> 
2

Se puede cambiar el nombre de una entrada utilizando el método del siguiente puesto, pero modificándola ligeramente:

how to remove 'name' attribute from server controls?

I-Rode sobre el método RenderChildren en un control Page tan sólo quería el control total del HTML para algunos controles:

protected override void RenderChildren(HtmlTextWriter writer) 
{ 
    var unScrewNamesRender = new RenderBasicNameHtmlTextWriter(writer); 
    base.RenderChildren(unScrewNamesRender); 
} 

private class RenderBasicNameHtmlTextWriter : HtmlTextWriter 
{ 
    public RenderBasicNameHtmlTextWriter(TextWriter writer) : base(writer) { } 

    public override void AddAttribute(HtmlTextWriterAttribute key, string value) 
    { 
     if (key == HtmlTextWriterAttribute.Name && value.Contains("POLine")) 
     { 
      value = value.Substring(value.LastIndexOf("$") + 1); 
     } 

     base.AddAttribute(key, value); 
    } 
} 

Necesita saber lo que está haciendo si lo intenta, WebForms pensará que falta el control por lo que no puede usarlo en ninguna de las devoluciones. Para mis propósitos, donde quería agregar un número arbitrario de líneas múltiples, ya sea del servidor o del lado del cliente sin tener que lidiar con los controles. Ajax de Net, funciona bien.

0

Una solución jQuery

function removeNameAttribute() { 
      $('input, select').each(function() { 
       $(this).removeAttr("name"); 
      }); 
     } 
0

// utilizar un HtmlGenericControl

HtmlGenericControl input = new HtmlGenericControl("input");`` 
input.ID = "lvFields_tbVal_somekey"; 
input.Attributes.Add("name", "tbVal"); 
input.Attributes.Add("type", "text"); 
input.ClientIDMode = ClientIDMode.Static; 
Cuestiones relacionadas