Enable button on ASP.NET after HttpResponse - javascript

I have button on my ASP.NET page which calls gets disabled on click(to prevent double click) and call this function:
Private Sub ExportToExcel(ByVal nameReport As String, ByVal wControl As GridView, ByVal sTitle As String)
Dim responsePage As HttpResponse = Response
Dim sw As New StringWriter()
Dim htw As New HtmlTextWriter(sw)
Dim pageToRender As New Page()
Dim form As New HtmlForm()
wControl.AllowPaging = False
wControl.EnableViewState = False
wControl.DataSource = GetDataSource(False)
wControl.DataBind()
wControl.Caption = "<strong>" + sTitle + "</strong>"
form.Controls.Add(wControl)
pageToRender.Controls.Add(form)
responsePage.Clear()
responsePage.Buffer = True
responsePage.ContentType = "application/vnd.ms-excel"
responsePage.AddHeader("Content-Disposition", "attachment;filename=" & nameReport)
responsePage.Charset = "UTF-8"
responsePage.ContentEncoding = Encoding.Default
pageToRender.RenderControl(htw)
responsePage.Write(sw.ToString())
responsePage.End()
End Sub
Which I use to export some data to Excel. Now I need to re-enable the button on client side when the HttpResponse is finished. How can I do that?

The Response.End() aborts the thread and sends the execution to Application_EndRequest. There is not much to do after that.
Please check this post. It presents a solution using iframes.

Related

Clicking on a button with HTMLUnit return just partial code

I'm trying to surf inside an asp.net site with Java using HTMLUnit. When I request the final println at the bottom of the java code the console return just partial code instead of entire webpage's html... I've already tried to add waits for the JavaScripts and other common stuff like Xpath... anyone can help?
Here's my code:
public static HtmlPage submittingForm(String user, String pssw) throws Exception { java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF);
try (final WebClient webClient = new WebClient(BrowserVersion.CHROME)) {
webClient.getOptions().setThrowExceptionOnScriptError(false);
final HtmlPage page1 = webClient.getPage("someUrl");
final HtmlForm form1 = page1.getFormByName("someForm");
final HtmlTextInput username = form1.getInputByName("inputName");
username.setValueAttribute(user);
final HtmlPasswordInput password = form1.getInputByName("someName");
password.setValueAttribute(pssw);
final HtmlPage page2 = (HtmlPage) form1.getInputByValue(" Login ").click();
HtmlAnchor loginLink = page2.getAnchorByHref("anyHref");
HtmlPage page3 = loginLink.click();
final HtmlForm form2 = page3.getFormByName("formName");
lastPage = (HtmlPage) form2.getInputByValue("buttonName").click();
System.out.println(lastPage.asXml());
}
return lastPage;
}
In my experience it is likely that you simply have to wait for ajax to finish loading the wanted parts of the web site.
I use methods like this:
//wait for ajax no longer than this number of seconds
private static final int AJAX_MAX_TRIES_SECONDS = 30;
public static void waitForAjaxUntilTextAppearsInXmlSource(//
#Nonnull final DomNode element, //
#Nonnull final String text, //
#Nonnull final String waitingLogMessage) throws WaitingForAjaxTimeoutException {
LOGGER.debug("Waiting for ajax call to complete ... [" + waitingLogMessage + "]");
final StringBuilder waitingdots = new StringBuilder(" ");
for (int i = 0; i < AJAX_MAX_TRIES_SECONDS; i++) {
if (element.asXml().contains(text)) {
waitingdots.append(" ajax has finished [").append(text).append(" appeared in xml]");
LOGGER.debug(" " + waitingdots);
return;
}
waitingdots.append('.');
wait(element);
}
LOGGER.warn(waitingdots.append(" ajax timeout [Text '" + text + "' did not appear in XML-source]").toString());
LOGGER.warn("Page source:\n" + element.asXml());
throw new WaitingForAjaxTimeoutException();
}

Adding a Javascript alert on successful form submission - VB.Net

I'm trying to add an alert when a user submits a form. I want it to only show the alert when the submit is successful, otherwise I would just attach a javascript alert to the submit button. I followed the method suggested here:
http://www.aspsnippets.com/Articles/Dsplay-Alert-Message-in-ASPNet-from-code-behind-using-C-and-VBNet.aspx
but the alert part isn't working. I tried putting the alert code in the Page_Load and it worked, but when I put it in the button click handler, I don't get any alert.
Public Sub Send_Data(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnNewsletter.Click
Dim sFName, sLName As String
Dim sEmail As String
Dim clsUser As New clsLogin
Dim iConfirm As Integer
sEmail = email.Text
If sEmail = "" Then Exit Sub
Try
If clsUser.Check_Cookie = False Then
iConfirm = clsUser.Create_Acct("", "", sEmail, "", iType)
End If
clsUser.Add_AvailLog(0, iType, iChat)
Catch
End Try
'start JK
Dim blog As Destinations.GetBlog
Dim TargetURL As String
TargetURL = "http://wimco.us8.list-manage.com/subscribe/post?u=fe50a5183f6f54bb70a7005e3&id=b2e21157fc"
Dim html As String
Dim PostData As String
PostData = "&EMAIL=" & sEmail & "&b_fe50a5183f6f54bb70a7005e3_b2e21157fc=&subscribe=Subscribe"
html = blog.PostData(TargetURL, PostData)
email.Text = ""
' This is the alert section
Dim message As String = "Order Placed Successfully."
Dim sb As New System.Text.StringBuilder()
sb.Append("<script type = 'text/javascript'>")
sb.Append("alert('")
sb.Append(message)
sb.Append("');")
sb.Append("</script>")
Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "alert", sb.ToString())
End Sub
I have been doing something similar to this and your code looks ok.
Have you tried to debug your code and made sure the code reaches the end of the Send_Data function where RegisterClientScriptBlock is called?
I have a feeling it stopped at If sEmail = "" Then Exit Sub.
You have to put the alert to the page which is shown after the submitted page.

javascript not firing after setting onclientclick in gridview rowdatabound

I want to fire a javascript to confirm deleting the row.
This is the rowdatabound
Private Sub GridSlide_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridSlide.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
DirectCast(e.Row.FindControl("LinkDelete"), LinkButton).Attributes.Add("OnClientClick", "javascript:DeleteSlide('" & Convert.ToString(e.Row.RowIndex) & "')")
End If
End Sub
This is the javascript
function DeleteSlide(var_row) {
var blnResponse = null;
var strMessage = '';
try {
strMessage = 'Are you sure you want to delete this slide data?';
blnResponse = window.confirm(strMessage);
if (blnResponse) {
__doPostBack('DeleteSlide()', var_row );
}
}
catch (Err) {
alert('DeleteSlide - ' + Err.description);
}
}
but when I click the delete link button, the javascript won't fire.
What's the problem?
P.S. I tried using the CommandArgument and Container.DataItemIndex but that caused a whole lot more errors so I ended up using the rowdatabound.
Try this:
DirectCast(e.Row.FindControl("LinkDelete"), LinkButton).OnClientClick = "javascript:DeleteSlide('" & Convert.ToString(e.Row.RowIndex) & "')";

Getting asp:TextBox text property in codebehind from a web user control after a javascript update

Here is the scenario.
I have a simple page containing an asp:PlaceHolder.
<%# Page Title="" Language="VB" MasterPageFile="~/MasterPage.master" AutoEventWireup="false" CodeFile="TrainingPlan.aspx.vb" Inherits="TrainingPlan" %>
<%# Reference Control="ctlTask.ascx" %>
<%# Reference Control="ctlTaskheader.ascx" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
<div class="centered">
<h2><asp:Label ID="lblPlanTitle" runat="server" Text="Plan Title"></asp:Label></h2>
<hr />
<br />
<asp:ImageButton ID="imgbtnSave" runat="server" ImageUrl="~/Images/save.ico" />
<br />
<asp:PlaceHolder ID="PlanPlaceHolder" runat="server"></asp:PlaceHolder>
</div>
</asp:Content>
The placeholder on this page is populated with several rows of the same web user control. This web user control contains several textboxes. For each textbox in this web user control I have public properties to set and get the text value. In the page load event of the web user control I am adding onClick attributes to some of those textboxes like so.
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
txtTrainingStart.Attributes.Add("onClick", "txtTrainingStart_Click(" & txtTrainingStart.ClientID & ", " & txtTask.ClientID & ");")
txtTraineeBadgeNum.Attributes.Add("onClick", "txtTraineeBadgeNum_Click(" & txtTraineeBadgeNum.ClientID & ", " & txtTask.ClientID & ", " & txtTrainingStart.ClientID & ");")
txtTrainerBadgeNum.Attributes.Add("onClick", "txtTrainerBadgeNum_Click(" & txtTrainerBadgeNum.ClientID & ", " & txtTrainingComplete.ClientID & ", " & txtTask.ClientID & ", " & txtTraineeBadgeNum.ClientID & ", " & Session.Item("isTrainer").ToString.ToLower & ");")
txtDecertifyingOfficial.Attributes.Add("onClick", "txtDecertifyingOfficial_Click(" & txtDecertifyingOfficial.ClientID & ", " & txtTrainerBadgeNum.ClientID & ", " & txtTask.ClientID & ", " & Session.Item("isDecertifyingOfficial").ToString.ToLower & ");")
End Sub
For each of those onClick events I have corresponding javascript functions.
<script type="text/javascript">
function txtTrainingStart_Click(txtTrainingStart, txtTask) {
//processing and updates to textboxes here
}
</script>
Here is the problem.
On the main page containing the placeholder I have a save button. In the click event of the save button I am looping through each of the web user controls contained in the placeholder to process and save the data.
Protected Sub imgbtnSave_Click(sender As Object, e As ImageClickEventArgs) Handles imgbtnSave.Click
For Each item As Control In PlanPlaceHolder.Controls
Dim task As ctlTask = TryCast(item, ctlTask)
If Not IsNothing(task) Then
'need updated textbox values here.
'The following line gets the original textbox value, not the updated value that I need
Dim test As String = task.trainingStart
End If
Next
End Sub
Everything I have tried I can only get the original value that was in the textbox when the page loaded. I would think that this should be simple and I am just missing something basic. I've searched google high and low for the solution but I have yet to find one. This was the closest thing I found -> Set Text property of asp:label in Javascript PROPER way.
Although that post deals with a label rather than a textbox and isn't using a placeholder containing several web user controls. From what I understand I need to POST the updates back to the server from the client but I don't know how to do this. I've tried using the Request.Form property but I couldn't seem to make that work. What am I missing?
Thank you for any help,
Rylan
EDIT
Here is the code that populates the placeholder with the web user controls as requested
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim DBConn As MySqlConnection
Dim cmd As New MySqlCommand
DBConn = New MySqlConnection(Globals.mysqlConStr)
Try
lblPlanTitle.Text = Request.QueryString("plan_name") & " Training Plan"
If Session.Item("empID") = -1 Then
empID = clsUser.getID
Else
empID = Session.Item("empID")
End If
Dim strSQL As String = "SELECT * FROM task_revs tr WHERE tr.change != 'Deleted' and tr.id_plan = " & Request.QueryString("id_plan") & " ORDER BY task_num, rev_date desc"
Dim da As New MySqlDataAdapter(strSQL, DBConn)
Dim dtAllRevs As New DataTable
da.Fill(dtAllRevs)
Dim dtCurrentRev As New DataTable
Dim lastTaskNum As String = ""
dtCurrentRev = dtAllRevs.Clone
For Each row As DataRow In dtAllRevs.Rows
If lastTaskNum <> row("task_num") Then
dtCurrentRev.ImportRow(row)
lastTaskNum = row("task_num")
End If
Next
strSQL = "SELECT * FROM checkoffs WHERE emp_id = " & empID
da = New MySqlDataAdapter(strSQL, DBConn)
Dim dtCheckoffs As New DataTable
da.Fill(dtCheckoffs)
Dim addColor As Boolean = True
Dim tabWidth As Integer
Dim Header As ctlTaskHeader = LoadControl("ctlTaskHeader.ascx")
PlanPlaceHolder.Controls.Add(Header)
For Each row As DataRow In dtCurrentRev.Rows
Dim newRow As ctlTask = LoadControl("ctlTask.ascx")
tabWidth = 0
newRow.id_Task = row("id_Task")
newRow.taskNum = row("task_num")
newRow.task = row("task")
If row("is_header") = True Then
If row("task_num").ToString.EndsWith(".0") And row("task_num").ToString.Split(".").Count = 2 Then
newRow.taskBold = True
newRow.taskItalic = True
Else
newRow.taskForeColor = Drawing.Color.Blue
newRow.taskItalic = True
tabWidth += 10
End If
Else
tabWidth += 10
End If
For i As Integer = 0 To row("task_num").ToString.Split(".").Count - 3
tabWidth += 10
Next
newRow.TabSize = tabWidth
If Not IsDBNull(row("task_level")) Then
For i As Integer = 0 To row("task_level") - 1
newRow.taskLevel = newRow.taskLevel & "*"
Next
End If
If addColor = True Then
newRow.taskNumBackColor = Drawing.Color.LightGray
newRow.taskLevelBackColor = Drawing.Color.LightGray
newRow.taskBackColor = Drawing.Color.LightGray
newRow.trainingStartBackColor = Drawing.Color.LightGray
newRow.trainingCompleteBackColor = Drawing.Color.LightGray
newRow.traineeBadgeNumBackColor = Drawing.Color.LightGray
newRow.trainerBadgeNumBackColor = Drawing.Color.LightGray
newRow.decertifyingOfficialBackColor = Drawing.Color.LightGray
End If
addColor = Not addColor
For Each checkoff As DataRow In dtCheckoffs.Rows
If checkoff("id_task") = row("id_task") Then
If Not IsDBNull(checkoff("training_start")) Then
newRow.trainingStart = checkoff("training_start")
End If
If Not IsDBNull(checkoff("training_complete")) Then
newRow.trainingComplete = checkoff("training_complete")
End If
If Not IsDBNull(checkoff("trainee_badge")) Then
newRow.traineeBadgeNum = checkoff("trainee_badge")
End If
If Not IsDBNull(checkoff("trainer_badge")) Then
newRow.trainerBadgeNum = checkoff("trainer_badge")
End If
If Not IsDBNull(checkoff("decertifying_official")) Then
newRow.decertifyingOfficial = checkoff("decertifying_official")
newRow.taskNumBackColor = Drawing.Color.LightSalmon
newRow.taskLevelBackColor = Drawing.Color.LightSalmon
newRow.taskBackColor = Drawing.Color.LightSalmon
newRow.trainingStartBackColor = Drawing.Color.LightSalmon
newRow.trainingCompleteBackColor = Drawing.Color.LightSalmon
newRow.traineeBadgeNumBackColor = Drawing.Color.LightSalmon
newRow.trainerBadgeNumBackColor = Drawing.Color.LightSalmon
newRow.decertifyingOfficialBackColor = Drawing.Color.LightSalmon
End If
End If
Next
If row("is_header") = True And PlanPlaceHolder.Controls.Count > 1 Then
Dim newLine As LiteralControl = New LiteralControl("<br/>")
PlanPlaceHolder.Controls.Add(newLine)
End If
PlanPlaceHolder.Controls.Add(newRow)
Next
Catch ex As Exception
clsLog.logError(ex)
Finally
DBConn.Close()
End Try
EDIT 2
I thought it might also be important to show how I am making updates to the textboxes in my javascript functions
function txtTrainingStart_Click(txtTrainingStart, txtTask) {
var currentdate = new Date();
var datetime = (currentdate.getMonth() + 1) + "/" + currentdate.getDate() + "/" + currentdate.getFullYear() + " " + getTimeAMPM();
txtTrainingStart.value = datetime;
txtTrainingStart.style.backgroundColor = "yellow";
}
Edit 3:
The below code will work for static controls, but dynamically-created controls will not be preserved on postback. You will need to store the updated values so they can be retrieved on postback somehow (e.g. a Session variable or HiddenField). If possible, I would create the controls statically and populate them in page_load, hiding controls with no data - this would allow you to get the values on postback as below.
Hmm...I set up a super simplified version of your code and ran it pretty much as is (without the database function), and it seems to be working fine.
Here is the simplified version I used:
<asp:Content id="Content1" ContentPlaceHolderID="MainContent" runat="server">
<asp:ImageButton ID="imgbtnSave" runat="server"></asp:ImageButton>
<asp:PlaceHolder ID="PlanPlaceHolder" runat="server">
<asp:TextBox runat="server" ID="txtTrainingStart" value="before" ></asp:TextBox>
</asp:PlaceHolder>
</asp:Content>
Javascript:
function txtTrainingStart_Click(txtTrainingStart, txtTask) {
var currentdate = new Date();
var test = "after";
txtTrainingStart.value = test;
txtTrainingStart.style.backgroundColor = "yellow";
}
VB:
Protected Sub imgbtnSave_Click(ByVal sender As Object, ByVal e As ImageClickEventArgs Handles imgbtnSave.Click
For Each item As TextBox In PlanPlaceHolder.Controls
'need updated textbox values here.'
Debug.WriteLine(item.ID)
Debug.WriteLine(item.Text)
Next
End Sub
I'm getting the updated value of the textbox, so you should be able to pass that value to a function and do whatever operations you need.
Let me know if I'm missing something.
Edit 2: I just had a thought--can you check if page_load is being called after you click the save button? I wonder if it is overwriting your updated values with the original values again.
If it is, I would wrap the database functionality in page_load with a postback check:
If Not IsPostBack
' connect to database'
' populate placeholder'
End If
I have figured it out. I was on the right track using Request.Form I just didn't fully understand how to use it yet.
New code for my save button
Protected Sub imgbtnSave_Click(sender As Object, e As ImageClickEventArgs) Handles imgbtnSave.Click
Dim coll As NameValueCollection
coll = Request.Form
For x = 0 To coll.Count - 1
Response.Write("Key = " & coll.GetKey(x) & " Value = " & coll(x) & "<br />")
Next
End Sub
The loop outputs all the control keys and updated values from the postback like so.
Key = ctl00$MainContent$ctl01$txtTrainingStart Value = 8/1/13
Key = ctl00$MainContent$ctl01$txtTrainingComplete Value = 8/2/13
Key = ctl00$MainContent$ctl02$txtTrainingStart Value = 8/3/13
Key = ctl00$MainContent$ctl02$txtTrainingComplete Value = 8/4/13
I use a hidden field to store a database row id with each dynamically created web user control. From that point it's easy to insert the updated values into my database.

Passing Variable from JS to VB.net

I have a variable that gets a value in a js function. I need to get its value as a double into a vb.net variable.
I have tried putting the variable into a label then grabbing it from the label in vb.net as shown in the code below:
Js part.
document.getElementById("Label1").innerText = nwLat;
then in the vb part
Dim nwLat As Double
nwLat = Label1.Text
MsgBox(nwLat)
it does not work for me any ideas? the error that comes up is
Input string was not in a correct format.
Cheers!
Easiest way without any type of ajax would be to use a hidden field.
Markup:
<asp:HiddenField ID="nwLatHidden" runat="server" Value="" />
JS:
document.getElementById('nwLatHidden').value = '6.00'; // or of course the value from your function.
.NET during your postback routine:
Dim nwLat As Double
nwLat = nwLatHidden.Value
In JavaScript:
__doPostBack(
'edit',
JSON.stringify({ ID: id, Code: code, AcctNo: acctNo })
);
In VB.NET:
Protected Sub Page_Load(s As Object, e As EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
'...
Else
Dim eventTarget As String = Request.Form!__EVENTTARGET
Dim eventArgument As String = Request.Form!__EVENTARGUMENT
If Not eventArgument Is Nothing AndAlso Not eventTarget Is Nothing AndAlso eventTarget = "edit" Then
Dim jss As New JavaScriptSerializer()
Dim ac As AccountCode = jss.Deserialize(Of AccountCode)(eventArgument)
End If
End If
End Sub
You need to use the ClientID or the UniqueID:
document.getElementById("<%=Label1.UniqueID%>").innerText = "Hi";

Categories