nombre de entrada y cambios de identificación cuando se establece runat = server

En mi forma, necesito insertar diferentes entradas de tipo “texto”. Las entradas deben ser controles html con nombre e id. Porque envío este formulario a una url externa.

Para la validación, ejecuto runat = server en todas las entradas y luego puedo usar requiredvalvalidator.

Pero el problema es que cuando miro la fuente después de visitar la página, cambian el nombre y el ID. por ejemplo

 

cambios a

  

Tengo que usar controles html porque la postbackurl externa mira los valores de id y nombre para encontrar el control. Entonces no puedo usar controles asp. Es por eso que utilicé controles html con runat = server

Agradezco cualquier ayuda

Esto es porque estás usando MasterPages.

Los controles contenidos en una página de contenido toman una ID dinámica basada en la jerarquía de la página maestra para evitar la duplicación de las identificaciones.

Si necesita hacer referencia a los ID de control y los nombres en el script del lado del cliente, puede usar < %= first_name.ClientID %> .

Si usa .NET4, puede usar ClientIDMode="Static" para hacer que los ID generados sean consistentes, aunque esto tiene sus propias advertencias de conflicto de ID cuando, por ejemplo, usa varias instancias del mismo control de usuario en una página. Rick Strahl los describe aquí .

Sin embargo, si está utilizando validadores ASP.NET, entonces todo debería estar bien. En lugar de usar una input HTML, debe usar un control TextBox ASP.NET :

  
 ClientIDMode="Static" 

Esto bloquea de manera útil el ID de cualquier control runat = “server”, sin embargo , no bloquea el atributo ‘name’ de un elemento de entrada html.

Viendo en este caso que la única razón para tener el atributo runat = “server” en la entrada es usar la validación .Net, sugiero usar una biblioteca JS externa como jQuery para manejar esto.

Sin embargo, si, como yo, necesitas alterar el atributo de valor, el único trabajo que puedo ver es bastante desordenado. Si elimina runat = “server” de la entrada, puede colocar un control de servidor, como un literal, dentro del atributo value = “”.

Por ejemplo:

 " /> 

No intente utilizar prácticas de encoding tan erróneas como una solución alternativa de último recurso para evitar que el atributo de nombre cambie a un nombre de estilo .Net.

¿Alguien más sabe de otra manera de arreglar el nombre? (El elemento de formulario no se define como runat = “server”, pero está incrustado dentro del formulario .Net normal, que es la razón por la cual el servidor lo está asociando al árbol de formulario principal)

ClientIDMode solo afecta a los ID. si también necesita administrar el atributo de nombre, entonces es inútil. En mi caso, resolví esto en el lado del cliente con jQuery.

 $(function(){ $("#inputname").prop("name",$("#inputname").prop("id")); }); 

Agregar ClientIDMode="Static" al control, por ejemplo

  

Esta es una nueva característica en .NET 4. Documentación oficial .

Puede hacer la validación en la página asp:

      

Si desea validar en JS puede probar esta respuesta: ¿Cómo puedo acceder a runat = “server” ASP element using javascript?

O si desea utilizar esta identificación en el lado del cliente, hágalo así:

 protected override void OnPreRender(EventArgs e) { first_name.ClientIDMode = ClientIDMode.Static; } 

Esta pregunta es demasiado grande en realidad: debe analizar los conceptos básicos de cómo funcionan las formas asp.net. Pruebe este artículo como punto de partida.

Básicamente, después de colocar el servidor runat = en la etiqueta, el servidor toma el control de la representación y el cableado de las entradas hasta los objetos del lado del servidor, por lo que este es el comportamiento esperado.

Si está buscando validar en el lado del servidor de esta página, luego publíquelo en otro lugar, probablemente necesite recrear la publicación, en el lado del servidor, una vez que se complete la validación.

Aquí está la misma respuesta que @saplumbaga pero en Javascript puro:

  • Esto arregla todas las entradas:

     window.addEventListener("load", function () { var fix = function(el) { el.setAttribute("name", el.getAttribute("id")); }; var els = document.getElementsByTagName("input"); for (var i = 0; i < els.length; i++) { fix(els[i]); } els = document.getElementsByTagName("select"); for (var i = 0; i < els.length; i++) { fix(els[i]); } els = document.getElementsByTagName("textarea"); for (var i = 0; i < els.length; i++) { fix(els[i]); } }); 
  • Para una sola entrada:

     window.addEventListener("load", function () { var el = document.getElementById("MyID"); el.setAttribute("name", el.getAttribute("id")); });