Reputation: 12397
We have created a User Control for ASP.Net. At any one time, a user's profile page could contain between one and infinity of these controls. The Control.ascx file contains quite a bit of javascript. When the control is rendered by .Net to HTML, you notice that it prints the javascript for each control.
This was expected. I'd like to reduce the amount of HTML output by the server to increase page load times. Normally, you could just move the javascript to an external file and then you only need one extra HTTP request which will serve for all controls.
But what about instances in the javascript where we have something like
document.getElementById('<%= txtTextBox.ClientID %>');How would the javascript know which user control work with? Has anyone done something like this, or is the solution staring me in the face?
Upvotes: 0
Views: 602
Reputation: 461
Write a microsoft ajax client component.
This requires a lot of things to be done:
The component class may do all what you want because it knows all clientIds of your user control. This works for multiple instances of the same user control anyway. As a pitfall this is somewhat cumbersome to implement. But it is very clean.
Upvotes: 0
Reputation: 12397
Here was the solution:
My actual full-on solution was a little different. Each usercontrol contained a telerik radgrid. The client-side event handlers for the radgrid are of the form
radGrid_eventOccurred(sender, args) {where sender is the grid object.
So instead of using the usercontrols ID as the key in my code, I used the grid.
Say I need to update a textbox inside the usercontrol whenever I click on a row in the grid. I can now do something like this:
function radGrid_rowClick(sender, args) { var text = /*Get the text of the clicked row*/; var textBox = textBoxesObject[sender]; textBox.set_value(text); }
Upvotes: 0
Reputation: 126
Do you have the ability to use jQuery? The css selector functionality is extremely powerful for these types of scenarios. For example:
<div class="action" id="1">Node 1</div>
<div class="action" id="2">Node 2</div>
<div class="action" id="3">Node 3</div>
<div class="action" id="4">Node 4</div>
<div class="action" id="5">Node 5</div>
Then, you would have one JavaScript function and bind it to each element that meets the selector criteria. It might look like:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">
$('.action').click(function() {
var $t = $(this); //---here is your contextual node
alert($t.attr('id')); //---this alerts the id value of your node
});
</script>
Upvotes: 0
Reputation: 55946
Write functions that take IDs, put them in mysite.js and reference the file like this:
<script type="text/javascript" src="/mysite.js"></script>
Then when you make your calls in your controls do it like this:
<div onClick="DoMyFunctionThatIWant('<%= txtTextBox.ClientID %>')">...</div>
Then your function in js is something like this:
function DoMyFunctionThatIWant(domId)
{
var obj = document.getElementById(domId);
}
Upvotes: 2