This question pops up on the ASP.NET forums where I moderate:
"How do I find an HTML element on a Master Page, from a child page, using jQuery?"
I licked my chops. I like questions like this because when I don't know the answer, it gives me an excuse to explore and learn.
The problem is that element ids on the Master Pages get mangled, or decorated, to prevent duplicate ids on the final rendered HTML.
For instance a TextBox with an id like this: MasterPageTextBox
Ends up with an id like this: ctl00$MasterPageTextBox
Solution 1
We could hard-code the mangled id into the jQuery search criteria and it would work. But what a maintenance nightmare, in the future, the mangled id might change: Not acceptable. When people pay you money to write code, you should write good code.
Solution 2
If you are using ASP.NET 4, you have control over the generated ids and can make them predictable. Then you can hard-code the generated id into the CSS selector. However, that isn't the case for most sites at this time.
Solution 3
After Googling and Binging around a bit, I came up with this approach to use in the Master Page:
- protected void Page_Load(object sender, EventArgs e)
- {
- Page.ClientScript.RegisterHiddenField("HiddenFieldClientID", this.MasterPageTextBox.ClientID);
- }
The code above takes the generated ClientID and puts it in a HiddenField that gets sent to the browser. The jQuery code in the child page can then get the value in the HiddenField and use it to search for the element. I thought this was pretty cool, but the jQuery code wouldn't compile because the HiddenField wasn't on its page. So an empty HiddenField control must be placed on the page. It's messy but it works! Here is how the jQuery on the child page accesses the hidden field and then accesses the TextBox on the Master Page:
- // ---- SetMasterPageTextBox ----
- // write hello in a textbox field on the master page
- function SetMasterPageTextBox()
- {
- // Get the hidden field
- var HidField = $("#HiddenFieldClientID");
- if (HidField.length == 1)
- {
- // get the contents of the hidden field
- var ClientID = HidField[0].value;
- // use it as the ID of the TextBox control
- $("#" + ClientID).val("Hello");
- }
- }

Join the conversation! Your thoughts help the community grow.