Good programming practice for Postbacks - asp.net

newbie to asp.net here. I am building a reporting tool and trying to handle logic on one single page so that report A is one aspx page and so and so forth.
Therefore, many controls / queries actually do not need to get executed on first visit of the page, where only parameters, such as dates, columns, are needed as input.
On clicking a button, or postback i suppose, these controls whether in charts or gridview form would generate. Back in the old dates when I did some ASP programming, I would put all the controls, codes within a if block is see if it is a postback. Is there a more efficient way in doing so in ASP.net?
Thank you all.

Assuming ASP.NET WebForms:
If you need your code to be ran when a button is clicked, you should add your code into your button's click event handler.
<asp:button id="btn" runat="server" text="Submit" onclick="btn_Click" />
protected void btn_Click(object sender, eventargs e){
//code here
}

Related

How to submit data twice on an ASP.NET page

I have a webpage. At the top is a search bar that is inside a <form id="form1" runat="server">.
I also want to add a form on that same page that would allow users to register their details. Problem, ASP.NET only allows one form per page.
How can I achieve my goal? Any workarounds?
You can only have one server side form on a page.
If it is an option, you can have a client side form (without runat="server") with a separate action - this POST can go to a different page, where you will have to accessRequest.Form` to retrieve the values posted.
Another option is to use separate buttons for posting with different event handlers.
You can use the simple HTML form approach but there is the problem of always post the whole page back. or use mvc:
Are multiple forms on a single page supported in asp.net 3.5?
Put the code you want to be called in different button click events. Therefore, if the search button is clicked, only the code in the search buttons click event is run. If the register button is clicked, only the code in the registers click event is run.
Here is an example:
protected void Page_Load(object sender, EventArgs e) {
// Common code
}
protected void btnSearch_Click(object sender, EventArgs e) {
// Search code
}
protected void btnRegister_Click(object sender, EventArgs e) {
// Register code
}
Double clicking the buttons in the designer will create the click events in the code behind.
As already stated in the answer by #Simon, it's easy to have multiple click handlers in your code-behind to process exactly what you need on the page - this is the easiest way to solve the "lack of multiple forms" issue.
Something very useful in this situation is the DefaultButton attribute of the <asp:Panel> control. This means that should you have multiple areas of your page with (for instance) <asp:TextBox> controls, and each of those areas has a specific <asp:Button> associated, if the focus is in one of the textboxes then pressing Return or Enter will result in the DefaultButton being clicked.
For example...
<asp:Panel runat="server" DefaultButton="btnSearch">
Search: <asp:TextBox runat="server" id="txtSearcn"/>
<asp:Button runat="server" id="btnSearch" Text="Search" OnClick="btnSearch_Click"/>
</asp:Panel>
See MSDN for more information on the DefaultButton attribute of <asp:Panel>

asp.net: monitor user click

I'm trying to fire an event when a user clicks a hyperlink. But it would complain that the event is not defined:
<asp:HyperLink ID="HyperLink1" onmouseover="btnSubmit_Click" runat="server">www.google.com</asp:HyperLink>
<asp:Button
id="btnSubmit"
Text="Submit"
Runat="server" />
protected void btnSubmit_Click(object sender, EventArgs e)
{
btnSubmit.Text = "clicked a link!!!";
}
I see several problems.
You do not have any sort of click event setup on your hyperlink. You do have a "onmouseover" but based on MSDN's documentation there is no click event for that control.
You have a button defined, but no events associated with that button.
You have a function that appears to be an event handler, but the naming convention suggests that it is associated with the button that has no events.
Can you provide more detail of what you are trying to do? I assume the c# code you have posted resides in the code behind?
Update:
Try changing your code to this -
<asp:LinkButton ID="lb_Link" OnClick="btnSubmit_Click" Text="www.google.com" runat="server" />
Obviously this will not redirect you, but based on what your code does, it doesn't sound like you want a redirect...
The event you're trying to trigger is a server side event. You need to use client side code for what you want to do. Plus, there is no property known as onmouseover, you can add it as a client side event from code behind
HyperLink1.Attributes.Add("onmouseover","yourClientFunction");//this can be done in page load

Submit form to a non default page

I solved this problem in another instance by making some workaround but I want to get it clear this time as I understand my problem better.
My asp.net net page has a search functionality that searches the database based on 5 fields. The result is displayed in the gridview. The gridview is editable and I can update values. The problem is if I want to update multiple values, gridview won't allow it. So I included an extra column for checkbox. I have added a footer which has link to update all checked records.
Ok so here is the problem? How do I send the whole gridview to another page where I can capture the gridview values?
By default the page is submitted onto itself. If I change the default action page, the whole gridview and search, nothing will work.
So how do I submit the whole page (or part of it) to a different page other than the default action script?
I have not tried this specifically with a gridview, but I think a Cross Page PostBack should work. I have a search feature on my website as well and this is what I use.
Set the PostBackUrl of the Button that is causing the PostBack to the Destination page.
Let’s assume your source page is search.aspx and your destination page is SearchResult.aspx
Inside search.aspx:
<asp:Button ID="btnSearch" runat="server" Text="Search" CssClass="right"
ValidationGroup = "Search"
PostBackUrl="~/SearchResult.aspx"
onclick="btnSearch_Click"/>
The form will be posted to SearchResult.aspx. Inside SearchResult.aspx, you add this directive:
<%# PreviousPageType VirtualPath="~/Search.aspx" %>
And in the code behind, you can acess any control like this:
PreviousPage.<mycontrol>
Hope this help.
Have you tried using the Session? Just add the DataSource, or the Gridview itself to the Session and load it in the other Page and then Dispose() it.
Good luck!
UPDATE:
I have accomplished this in the past through Cross-Page Posting. This is how I did it now for testing purposes:
Default.aspx:
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" PostBackUrl="SearchResult.aspx" />
SearchResult.aspx.cs:
protected void Page_Init(object sender, EventArgs e)
{
if (PreviousPage != null)
{
if (Page.PreviousPage.FindControl("GridView1") != null)
{
GridView grid = (GridView)Page.PreviousPage.FindControl("GridView1");
grid.ID = "myGrid";
this.form1.Controls.Add(grid);
}
}
}
Hopefully this helps.

aspx: a form is always forwarded to the same page

on the page products.aspx i created a form:
<form id="send_info_form" method="post" action="send_email.aspx">
<input type="text" name="the_name />
<input type="submit" />
</form>
when i click on submit it's forwarded to the same page (products.aspx) and not to the page i set in action attribute of the form.
It looks like you have a misunderstanding about how ASP.NET's logic works- ASP.NET has a much different paradigm than PHP or ASP does.
It seems like you're taking more of an ASP classic or PHP approach of directly handling the landing pages of forms and POST values, which you no longer have to do. You shouldn't need a separate page to handle the logic of the form submission either; this is all handled by event handlers in the submitting page's codebehind.
Instead of handling input elements directly, you should use ASP.NET's server controls to handle all the inputs for you.
What you should be doing is:
In the Products.aspx page:
E-mail Address: <asp:TextBox runat="server" ID="txtEmail" />
<asp:Button runat="server" ID="btnSubmit" OnClick="btnSubmit_Click" Text="Submit" />
Note that there's no form tag required (besides the one already provided to you when you first make the ASPX page.
Since you're working with an object-oriented language with a business objects representing all of your HTML elements with ASP.NET, you don't have to handle reading from the POST values of the form directly.
In the codebehind for Products.aspx (I'm assuming C#, so Products.aspx.cs), add a method for btnSubmit_Click:
protected void btnSubmit_Click(object sender, EventArgs e) {
string sendEmailTo = txtEmail.Text;
// insert mail sending logic here
}
In ASP.NET, the tag will by default always post itself to the same page. This allows you to handle any events in the codebehind in the ASPX page. It's not clear from your question what exactly you're trying to do. I can think of three possible scenarios:
1) You want to post back to the same page, and toggle visibility of UI elements (other panels, etc.) based on the result of the processing, or redirect the user to a second destination page once processing is complete. This is the most common scenario and the approach I recommend be taken, because it keeps all the logic regarding the processing of the form in one place.
2) You can specify a PostBackUrl to specify another (ASP.NET) page for button controls and whatnot. From there you can do the processing from elements on the first page on the second page using the PreviousPage property. See http://msdn.microsoft.com/en-us/library/ms178139.aspx for more information.
3) If you have a separate page you wish to post to that you don't control that's not ASP.NET-based (i.e., another site's form, or a PHP/ASP3.0 site you run), things get significantly more difficult. ASP.NET puts everything in one giant elements. Since tags cannot reliably be embedded within each other in HTML, you will either have to do a silent POST manually from your codebehind, or use Javascript to quietly submit an ajax request upon submission.

How do I show a modal dialog while the databind occurs?

I have a form with gridview that is bound to a complex stored procedure (financial data). This query takes about 3 minutes to run and load the gridview. The users get impatient and click "Search" repeatedly, which just makes things worse.
As an interim solution, I'd like to show a progress bar, and I found a solution using the ASP.NET AJAX ModalPopupExtender.
This is the code I have for adding the extender to the page:
<ajaxToolkit:ModalPopupExtender ID="mdlPopup" runat="server" TargetControlID="Button1"
PopupControlID="pnlPopup" BackgroundCssClass="modalBackground" />
<asp:Panel ID="pnlPopup" runat="server" CssClass="updateProgress" style="display: none">
<div align="center" style="margin-top: 13px;">
<img src="../images/progress.gif" alt="Progress" />
<span class="updateProgressMessage">Loading ...</span>
</div>
</asp:Panel>
This is the very simple code for the button's click event:
protected void Button1_Click(object sender, EventArgs e)
{
gvInvoice.DataBind();
}
The problem is, when I click the Search button, the modal dialog pops up but the Databind() method never gets called. I tried using mdlPopup.Show() but that doesn't show the dialog and instead just runs the Databind().
What am I missing? How do I ensure that the modal dialog appears, the databind runs, and the modal dialog subsequently disappears?
I think what you need to do here is separate the showing of the dialog and the binding from the fetching of the data.
I would probably solve the problem using an approach like this:
Show Dialog and spin thread to go fetch the data. (the thread would put the data in the session cache, or a customised cache on a database.)
Have the client poll the server for if the data is available (probably using AJAX calls to static page methods).
When the data is available, hide the dialog and do the databind.
You can put additional checks/conditions around when the thread is started so that you don't start too many threads if the user presses search a number of times. I.e. if they haven't changed the search criteria then don't start a new search, but just continue polling.
It looks like you try to show progress panel (modal popup) for full page post-back?
mdlPopup.Show() would work if the search action is done within updatepanel
In your scenario, try this instead
- Step 1, set the TargetControlID of the modalpopupextender to a dummy hidden control
- Step 2, added javascript call that shows the modalpopup $find('mdlPopup').show(); before the post-back call of search button's onclient event (just like adding a validation before post-back)
James

Resources