Dynamically Loading User Controls In C# Web Application Rather Than Website
Dec 27, 2010
I am trying to create my own website management framework similar to DNN/SiteFinity (only a mucho cut down version).
One of the big (but common) features is to be able to dynamically add user controls to provide additional functionality.
I would prefer to use a pre-compiled .NET "Web Application" over a dynamically compiled "Website".
What are the implications of using LoadControl method to dynamically add a user control for a pre-compiled web applications with specific regard to:
Session (preume I am using the stateserver)What happens to all the other users - will they be logged out?
Application pool recycling due to changes to some compilation??
I am not sure I have ever dynamically added a user control to a pre-compiled web applications as I have mainly been using "Websites" so I am making a large presumption that it will work because if the website is pre-compiled, does this mean the dynamically added user control will be dynamically compiled as required even though the site is pre-compiled?
EDIT
I also forgot to mention that the user controls will be outside of the application directory and so won't be published during web deploy - they will be uploaded via another website.
The web page I am trying to (slowly) build should allow users to add whichever user controls they want on their page, and order them whichever way they like. This is saved in a database.
So each user could have a different number of controls on the page.
This is the design code, at the minute the user controls are fixed and are not loaded dynamically. They user controls are stored in 'blocks' which look like widgets on the page and can be dragged about to different columns. For each user the layout is stored in the DB i.e. which blocks are in column 1 and which blocks in column 2 etc.
How could I change this so that it can create a 'block' div for each user control returned from the database and put the user control in that block and in the right column?
I am working on a pretty heavy page in an application and the scenario is:
There is a Tab control in the page, having four tabs. These tabs individually consist of different user controls and other asp controls. Most of these usercontrols in turn consist of other user controls. Every user control contains huge javaScript functions which validate them, populate controls and call web services.
What I am trying to achieve is to load only the Tab and its user controls on the page load and when the user clicks on a specific tab, load its contents (User controls) dynamically. Once that is done, I am setting the tab's postback to false to prevent loading it again once loaded.
I tried to achieve this by making the user controls in the other tabs - visible="false" in the markup and loading them from server side on some specific event. But that causes the javaScript functions in those user controls to give errors ('Object expected') when I go to that tab.
If I set the user controls in the other tabs to visible true, then no matter what; the page life cycle goes to each registered control and loads every subsequent control in that web user control which makes the main page slow (on loading and every postback).
The position of the Tab and the inner user controls is fixed. Although I am taking care that no data is populated unnecessarily on the page and user controls on hidden tabs, I dont want the tabs to get loaded altogether unless requested. If I load them on runtime, their corresponding javaScripts start giving errors.. note that I am not generating the controls on runtime, they exist in the page design. I just dont want to load them dynamically
First, I would like to apologize, the search on the site wasn't working, so I don't know if I'm missing an existing post or not.
I have a web page that uses a master page file. I am using a third party control from Component One(TabStrip), the tabs are rendered as links on the final page. When a tab(link) is clicked, I need to load the appropriate web user control associated with that tab. Each web user control has its own post backs and methods. I know that I can load the controls on the "SelectionChanged" event of the TabStrip control, but then any postback created by the web user control that is loaded causes the page to refresh and the control was never loaded in viewstate. So, I tried to put my procedure of loading the web user control into the page_init method. This would work, if I could read which link was clicked on from within the page_init method. I tried using a javascript function to run "onclick" of the tabs and within it setting the value of a hidden control. I have verified that the javascript works and that the hidden control's value is getting set correctly. When I get into the page_init method, the value of the hidden control is not readable.
I'm tying to understand the page lifecycle to the fullest, but I don't see what I'm missing here. I know that I need to load the web user controls in the page_init method in order to persist the page as a whole, but how can I get which tab(link) was clicked to know which control should be loaded?
Situation: I have a drop down list which I need to pass on to a webservice on button click. I am using Sys.Net.WebServiceProxy.Invoke to make webservice call.
Everything is happening inside a usercontrol which loads on runtime using dynamicpopulate extender.
I get following error:
Sys.InvalidOperationException: Cannot serialize object with cyclic reference within child properties.
Situation: Usercontrol also has a listview which is bound to dataset. However on calling listview.DataBind() in side the webservice method.
I get following error:
The ListView control 'ProductsListView' does not have a naming container. Ensure that the control is added to the page before calling DataBind.
There is no problem when call to service method is parameter less and listitem is not bound.
On a dashboard page I'm loading several controls dynamically; the controls always need to be loaded so there is no if (!Page.IsPostBack) code. The problem though is in that in the code-behind, we are using Request.Form.GetValues and a particular dropdown field's value is always null (presumably because the controls are being cleared and reloaded on a postback) and this is triggering an error later on in the page that expectes a value from this dropdown. I have to use Request.Form.GetValues because the page enables dynamically adding rows (each row containing 5+ HTML inputs) via Javascript.
If I check for postback, then the button event of the control does not fire at all but instead the dashboard page is reloaded, and no controls are loaded at all (i.e. the page is blank).
How do I get around this issue? I need to dynamically load the controls at all times, but I also need to retrieve the values via Request.Form.GetValues.
(Server-side, in ibtnGetQuote_Click - this is actually a loop since user can append multiple rows; "i" is appended to the word "Class" to find the exact row)
IList<string> classes = this.GetFormValues("Class1"); // This will return null all the time... private IList<string> GetFormValues(string clientID) { String[] values; values = Request.Form.GetValues(clientID); if (values == null) { Control ctl = FindControl(clientID); // uses built-in FindControl method values = Request.Form.GetValues(ctl.ClientID);......
The original code was hardcoding the "ctl00$xx$xx" stuff, but the control may or may not be loaded so we cannot guarantee the name the control will get. In fact, I'm not even sure if this will work for all scenarios since only the FIRST control is a server control, the rest are just standard HTML controls so wouldn't have a "ClientID".
I am loading a series of controls in the Page_Load event. However, I have to recreate those controls each page load, which means storing their data elsewhere. This is cumbersome.
protected void Page_Load(object sender, EventArgs e) { MyControl control = (MyControl)LoadControl(...); control.Initialize(GlobalClass.controlData); //^gives the control the data it had previously. //Or use ViewState["controlData"] if serializable. Controls.Add(control); }
I feel like I should be using if (!IsPostBack) {}, but I don't know how, or why. In contrast, if I place the controls into the markup, then the controls seem to stay persistent. For example, a button in mark-up will remember any changes to its Text property (I think?).
How do I maintain some sort of persistence with dynamically added controls, like controls added via mark-up? This would save me much work and frustration.
(I've coded for a small eternity, but the more I do ASP.NET, the more confused I become. Which is exactly the opposite of what how I understood learning to work :-P.)
I can't figure out how to get the legend to populate all the "strReason" and get the correct percents to show for each column. This is where I'm at right now.
had made a site for client in which users can make request for songs, there's a db haing songname, by whome, written by, sang at etc the site is hosted and working fine the way the admin gets to know what is asked for is by using the website but now he wants that there be a desktop application which diplays all the requests so he does not have to log in and use the website..
I have 3 user controls that I have to load at the same time. They each contain a gridview that pulls data from the database. They are doing a "delay" load of the data so there is a progress bar template that shows that the data is loading however the first gridview fires and loads, then the second, then the third and I need them to all fire at the same time.
I'm using partial page loads off a webservice and was curious if there was a way to load a control through the .asmx file when the part loads. I tried:
Control CallDetailsControl = this.LoadControl("~/mycontrol.ascx");
I have an .aspx page with multiple .ascx (User Controls on it). One of the User controls is very slow in loading (calls a very slow webservice for the data.). Now, my question is how to render all the controls on the page (so the User can view those) and have a rotating icon for this control (slow one) (till it loads). I know, I need to bring AJAX into picture, but any clarification on that would help as I will be new to AJAX programming.
I have a scenario that I cannot fit my small brain around at the moment. I have a database driven site that also has a variable amount of user controls that go on to some pages. Some pages do not have user controls associated with them).
So I'm returning the page's body text from the data base like this:
The quick brown fox %ucUserControl1.ascx% jumps over %ucUserControl2.ascx% the fence.
I'm using a text editor for the backend that I'd like to be able to specify a user control in text format (by wrapping it in some sort of tag-- % was used for my above example, but anything will work).
I have multiple user controls on the page that are used primarily for data entry purposes. When a product is loaded, I need to load the product data into all those user controls and retrieve data when I need to save the product. The user controls are not visible to the user directly, instead user would click on a link and the user control will open up in a modal popup.
Currently the way I'm doing this is, I've loaded all the user controls on the page in separate div controls, and showing the modal popup when the link is clicked. I'm sure loading all the user controls on the page is not a good idea. Is there a better way to handle this? I think we can show the markup using JSON with jQuery - but how can I load and retrieve the data using that?
I have been playing around with loading user controls in a CMS style where I can change the position and order. I have come up with this...
[Code]....
It all works fairly well - but I have alot of propertys in my user control code behinds where I could inject values into the usercontrol from my base class.
I like the way I can position usercontrols from the DB, I even added a time and date section where they could be switched on and off per day or time.
If I make every user control access the DAL for the data, it means i will have one select per user control, which means including my bassclass I could have upto 15 selects (visits tot he DB) to make the front page. Though this does not seem to make a performance problem, I was wondering if there was a better way of doing this.
Load data while Scrolling Page down with jQuery AJAX and ASP.Net.
I want to implement same thing but want to get data base on User input and implement the same. How to write Store Procedure where i can use where clause.
I have a requirement like need to display 5000+ records in gridview. So, I created scrollable div with gridview init and displaying 200 records per page. The website is running very slow because eveytime when user click on paging, it retrieving all the records from the database. I need to increase the website performance. I heard about a concept Girdview lazy loading but i don't know how to implement. I am looking for a solution like records should display in gridview when ever user scroll the bar down. How to do the gridview lazy loading.
The issue is with themelocation, which is declared just above this block of code - like so:
<% var reseller = new Reseller(); var storeSettings = new StoreSettings(); var themelocation = ""; if (Context.User.Identity.IsAuthenticated) { var resellerRepository = new ResellerRepository(); reseller = resellerRepository.GetResellerByUsername(Context.User.Identity.Name); var storeSettingsRepository = new StoreSettingsRepository(); storeSettings = storeSettingsRepository.GetStoreSettings((int) reseller.StoreSettingsID); themelocation = storeSettings.Theme.StylesheetLocation; } %>
Setting a break point shows that themelocation holds the string I need, but when the page is run - it generates a 400 - Bad Request error, and the net tab in firebug reveals its looking for this:
Right now I've got a large .aspx page - starts out loading tons of .css and .js files...
Code:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="AWCOffice.aspx.vb" Inherits="_AWCOffice" EnableViewState="false" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server">
[Code] ....
Then what follows is a large pile of javascript code - about 5800 lines of javascript code.
Code: <script type="text/javascript">
This is the main application. At the moment I like to keep it in the .aspx page because it's constantly changing and I don't want to worry about client caching and versioning.
After the JAVASCRIPT code comes the html - about 2000 lines of it.
The DIV ACS-SYSTEM is the only visible area of this HTML.
The DIV ACS-POOL has a css style of display:none and holds template HTML that jQuery copies into the ACS-SYSTEM dom space as the app runs.
Here's the actual question.
Most of the 2000 lines of HTML in the ACS-POOL is customer specific - not all of my customers need all 2000 lines of this HTML. And as I add customers the nightmare of managing all this in one "SOURCE FILE" becomes daunting.
Never mind the wasted band width of giving all my customers all this HTML - even parts they do not need.
What kind of options do I have for breaking down and "dynamically" loading this in a more CUSTOMER-SPECIFIC fashion?
I think I could use jQuery to simply feed it from my "boot webservice" call - but if I can do it in a more HTML-fashion I would think that would be better.
I used vs 2008 for coding this and in my IDE here at the office I change the CONNECTION STRING in the web.config to point to different customer databases. Anything I can do in the WEB.CONFIG that the .aspx page can pickup???
i have read your article on aspsnippets.com. Multilingual Website and i have implemented that i works good .but there is new problem arrising. suppose my default language is english set in internet option so the whenever website reloaded or redirected then all content will show in english language but
when i changed it to hindi then current webpage converted to hindi but after that if i pressed any button on current page or i redirected to any other link of particular website then again hindi is converted to english.