input name and id changes when set runat=server
In my form I need to insert different inputs of type "text". The inputs must be html controls with name and id's. Because I send this form to a external url.
For the validation I do runat=server in all inputs and then I can use requiredfieldvalidator.
But the problem is when I look in the source after visiting the page the name and id's are all changed. for example
<input id="first_name" class="formright" type="text" name="first_name" runat="server" />
changes to
<input name="ctl00$cphContent$first_name" type="text" id="ctl00_cphContent_first_name" class="formright">
I have to use html controls because the external postbackurl looks at the name and id values to find the control. So I can't use asp controls. It is because of that I used html controls with runat=server
I appreciate any help
Solution 1:
This is because you're using MasterPages.
Controls contained within a content page take on a dynamic ID based on the Master Page hierarchy in order to avoid duplication of IDs.
If you need to reference the control IDs and names in client-side script, you can use <%= first_name.ClientID %>
.
If you're using .NET4 you can use ClientIDMode="Static"
to make the generated IDs consistent, although this comes with its own ID-conflict caveats when, for example, using multiple instances of the same user control on a page. Rick Strahl outlines those here.
However, if you're using ASP.NET validators then everything should be fine. Instead of using an HTML input
you should use an ASP.NET TextBox control:
<asp:TextBox id="first_name" runat="server" CssClass="formright" />
Solution 2:
ClientIDMode="Static"
This usefully locks the ID of any runat="server" control, however it does not lock the 'name' attribute of a html input element.
Seeing in this instance the only reason to have the runat="server" attribute on the input is to use .Net validation, I would suggest using an external JS library such as jQuery to handle this.
If however, like me, you need to alter the value attribute, the only work around I can see is a rather messy one. If you remove the runat="server" from the input, you can place a server control, such as a literal, within the value="" attribute.
For example:
<input id="first_name" class="formright" type="text" name="first_name" value="<asp:Literal id="litFirstNameValue" runat="server" />" />
Please don't have a go at me for such bad coding practises, it's intended as a last resort workaround to keep the name attribute from changing to a .Net style name.
Does anyone else know of another way to fix the name? (The form element is not defined as runat="server", but it's embedded within the normal .Net form, which is why the server is attaching it to the main form tree)