net mvc custom asp .net asp.net validation forms

.net - custom - mvc required field validation



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

Agregar ClientIDMode="Static" al control, por ejemplo

<asp:TextBox ID="first_name" runat="server" ClientIDMode="Static" />

Esta es una nueva característica en .NET 4. ClientIDMode="Static" .

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

<input id="first_name" class="formright" type="text" name="first_name" runat="server" />

cambios a

<input name="ctl00$cphContent$first_name" type="text" id="ctl00_cphContent_first_name" class="formright">

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


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


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


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.


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 here .

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 :

<asp:TextBox id="first_name" runat="server" CssClass="formright" />


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

<asp:Label runat="server" AssociatedControlID="txtFullName" CssClass="hidden"></asp:Label> <asp:TextBox runat="server" ID="txtFullName" CssClass="user" MaxLength="25"></asp:TextBox> <asp:RegularExpressionValidator ID="regFullName" runat="server" CssClass="has-error" ControlToValidate="txtFullName" ValidationExpression="[a-zA-Z-''/s]+" ValidationGroup="ValidationGroupName" Display="Dynamic" OnServerValidate="regFullName"> </asp:RegularExpressionValidator>

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


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:

<input id="first_name" class="formright" type="text" name="first_name" value="<asp:Literal id="litFirstNameValue" runat="server" />" />

No intente utilizar prácticas de codificación 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)