473,386 Members | 1,763 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,386 software developers and data experts.

updating asp:HiddenField using a foreach of submitted values?

Here's the code I tried, and found it failed...

<form runat="server" method="post" name="CreditCardForm"
id="CreditCardForm">
<%
foreach (object item in Request.Form)
{
if (item.ToString().IndexOf("__") != 0)
{
//Response.Write(item + " = " + Request.Form[item.ToString()] +
"<br />");
item.Value = Request.Form[item.ToString()];
}
}
%>
<asp:HiddenField ID="EventID" runat="server" value=""></asp:hiddenfield>
<asp:HiddenField ID="EventLanguage" runat="server"
value=""></asp:hiddenfield>
<asp:HiddenField ID="EventAction" runat="server" value=""></asp:hiddenfield>
<asp:HiddenField ID="member_email" runat="server"
value=""></asp:hiddenfield>
<asp:HiddenField ID="member_first_name" runat="server"
value=""></asp:hiddenfield>
<asp:HiddenField ID="member_last_name" runat="server"
value=""></asp:hiddenfield>
.... plus another 10 or so fields...
</form>

this fails with the error "'object' does not contain a definition for
'Value'", which makes sense to be, but I'm not sure how to reference the
HiddenField using the object name

the form that's submitted contains fields for "EventID", "member_email",
etc., and I'd like to automatically update the Value of the new form's
hidden fields without having a bunch of if statements to see if it was
previously submitted.

Actually, the ideal solution would be to also create the hiddenfields
for each form element submitted, rather than have to list them all in
the new form.

for example, if eventID, eventLanguage, eventAction and member_email
were the only fields submitted from the first form, then only these
hiddenfields would be created in the new form, likewise if
"member_first_name" and "member_last_name" where submitted as well, then
there would be hidden fields for these 2 fields as well.

any tips or tricks??

Thanks in advance

Kevin
Aug 28 '06 #1
9 4649
Couldn't you do something like:

foreach(object item in Request.Form)
{
HiddenField hf = item as HiddenField;
if(hf!= null)
{
// process hidden field
}
}

Kevin Jones

Kevin Blount wrote:
Here's the code I tried, and found it failed...

<form runat="server" method="post" name="CreditCardForm"
id="CreditCardForm">
<%
foreach (object item in Request.Form)
{
if (item.ToString().IndexOf("__") != 0)
{
//Response.Write(item + " = " + Request.Form[item.ToString()] + "<br
/>");
item.Value = Request.Form[item.ToString()];
}
}
%>
<asp:HiddenField ID="EventID" runat="server" value=""></asp:hiddenfield>
<asp:HiddenField ID="EventLanguage" runat="server"
value=""></asp:hiddenfield>
<asp:HiddenField ID="EventAction" runat="server"
value=""></asp:hiddenfield>
<asp:HiddenField ID="member_email" runat="server"
value=""></asp:hiddenfield>
<asp:HiddenField ID="member_first_name" runat="server"
value=""></asp:hiddenfield>
<asp:HiddenField ID="member_last_name" runat="server"
value=""></asp:hiddenfield>
... plus another 10 or so fields...
</form>

this fails with the error "'object' does not contain a definition for
'Value'", which makes sense to be, but I'm not sure how to reference the
HiddenField using the object name

the form that's submitted contains fields for "EventID", "member_email",
etc., and I'd like to automatically update the Value of the new form's
hidden fields without having a bunch of if statements to see if it was
previously submitted.

Actually, the ideal solution would be to also create the hiddenfields
for each form element submitted, rather than have to list them all in
the new form.

for example, if eventID, eventLanguage, eventAction and member_email
were the only fields submitted from the first form, then only these
hiddenfields would be created in the new form, likewise if
"member_first_name" and "member_last_name" where submitted as well, then
there would be hidden fields for these 2 fields as well.

any tips or tricks??

Thanks in advance

Kevin
Aug 28 '06 #2
Kevin,

Yes I can... but I didn't know that until you mentioned it ;) Thanks..
that did the job perfectly.

I'd spoken to a colleague, and he'd mentioned FindControl which I was
looking into, and part of that was creating a new field (his example was
ListBox), so was starting to think along those lines - but your code
was exactly what needed, and saved me a lot of time.

cheers

Kevin

Kevin Jones wrote:
Couldn't you do something like:

foreach(object item in Request.Form)
{
HiddenField hf = item as HiddenField;
if(hf!= null)
{
// process hidden field
}
}

Kevin Jones

Kevin Blount wrote:
>Here's the code I tried, and found it failed...

<form runat="server" method="post" name="CreditCardForm"
id="CreditCardForm">
<%
foreach (object item in Request.Form)
{
if (item.ToString().IndexOf("__") != 0)
{
//Response.Write(item + " = " + Request.Form[item.ToString()] +
"<br />");
item.Value = Request.Form[item.ToString()];
}
}
%>
<asp:HiddenField ID="EventID" runat="server" value=""></asp:hiddenfield>
<asp:HiddenField ID="EventLanguage" runat="server"
value=""></asp:hiddenfield>
<asp:HiddenField ID="EventAction" runat="server"
value=""></asp:hiddenfield>
<asp:HiddenField ID="member_email" runat="server"
value=""></asp:hiddenfield>
<asp:HiddenField ID="member_first_name" runat="server"
value=""></asp:hiddenfield>
<asp:HiddenField ID="member_last_name" runat="server"
value=""></asp:hiddenfield>
... plus another 10 or so fields...
</form>

this fails with the error "'object' does not contain a definition for
'Value'", which makes sense to be, but I'm not sure how to reference
the HiddenField using the object name

the form that's submitted contains fields for "EventID",
"member_email", etc., and I'd like to automatically update the Value
of the new form's hidden fields without having a bunch of if
statements to see if it was previously submitted.

Actually, the ideal solution would be to also create the hiddenfields
for each form element submitted, rather than have to list them all in
the new form.

for example, if eventID, eventLanguage, eventAction and member_email
were the only fields submitted from the first form, then only these
hiddenfields would be created in the new form, likewise if
"member_first_name" and "member_last_name" where submitted as well,
then there would be hidden fields for these 2 fields as well.

any tips or tricks??

Thanks in advance

Kevin
Aug 28 '06 #3
Naturally I spoke too soon.

while this code works, I'm coming across another issue that's stopping
the page from working. My form on page 1 (which is being used by your
code below to update hiddenfields in page 2) contains 3 ListBox
controls. I'm finding that if I create a hiddenfield in page 2 that uses
the same name, I get an error:

[error]
Invalid postback or callback argument. Event validation is enabled
using <pages enableEventValidation="true"/in configuration or <%@ Page
EnableEventValidation="true" %in a page. For security purposes, this
feature verifies that arguments to postback or callback events originate
from the server control that originally rendered them. If the data is
valid and expected, use the
ClientScriptManager.RegisterForEventValidation method in order to
register the postback or callback data for validation.
[/error]

I've taken out everything from the second page, other than the <form
run=server...>, the <asp:HiddenField name="member_country"and </form>
tags, so assume there must be a problem with having a form control on
page 2 where it's name was used on page 1. Does that make sense to
anyone? It doesn't to me, and I've no idea what to look for as a solution.

help!!! ;)

Kevin Jones wrote:
Couldn't you do something like:

foreach(object item in Request.Form)
{
HiddenField hf = item as HiddenField;
if(hf!= null)
{
// process hidden field
}
}

Kevin Jones
Aug 28 '06 #4
How are you transferring control from the first form to the second?
Kevin Blount wrote:
Naturally I spoke too soon.

while this code works, I'm coming across another issue that's stopping
the page from working. My form on page 1 (which is being used by your
code below to update hiddenfields in page 2) contains 3 ListBox
controls. I'm finding that if I create a hiddenfield in page 2 that uses
the same name, I get an error:

[error]
Invalid postback or callback argument. Event validation is enabled
using <pages enableEventValidation="true"/in configuration or <%@ Page
EnableEventValidation="true" %in a page. For security purposes, this
feature verifies that arguments to postback or callback events originate
from the server control that originally rendered them. If the data is
valid and expected, use the
ClientScriptManager.RegisterForEventValidation method in order to
register the postback or callback data for validation.
[/error]

I've taken out everything from the second page, other than the <form
run=server...>, the <asp:HiddenField name="member_country"and </form>
tags, so assume there must be a problem with having a form control on
page 2 where it's name was used on page 1. Does that make sense to
anyone? It doesn't to me, and I've no idea what to look for as a solution.

help!!! ;)

Kevin Jones wrote:
>Couldn't you do something like:

foreach(object item in Request.Form)
{
HiddenField hf = item as HiddenField;
if(hf!= null)
{
// process hidden field
}
}

Kevin Jones
Aug 28 '06 #5
Kevin,

My pages contain the following:
form on page1
<form runat="server" method="post" name="EventForm" id="EventForm">
<% member_org_type_option1.Value =
commonText["organization_option_1b"].ToString(); %>
<% member_org_type_option1.Text =
commonText["organization_option_1b"].ToString(); %>
<% member_org_type_option2.Value =
commonText["organization_option_3"].ToString(); %>
<% member_org_type_option2.Text =
commonText["organization_option_3"].ToString(); %>
<% member_org_type_option3.Value =
commonText["organization_option_2b"].ToString(); %>
<% member_org_type_option3.Text =
commonText["organization_option_2b"].ToString(); %>
<% member_org_type_option4.Value =
commonText["organization_option_8"].ToString(); %>
<% member_org_type_option4.Text =
commonText["organization_option_8"].ToString(); %>
<asp:DropDownList ID="member_org_type" runat="server"
CssClass="smallFont" Width="300">
<asp:ListItem ID="member_org_type_option1" runat="server"></asp:ListItem>
<asp:ListItem ID="member_org_type_option2" runat="server"></asp:ListItem>
<asp:ListItem ID="member_org_type_option3" runat="server"></asp:ListItem>
<asp:ListItem ID="member_org_type_option4" runat="server"></asp:ListItem>
</asp:DropDownList>
</form>
page2:
simply has -
<asp:HiddenField ID="member_org_type"></asp:Hiddenfield>

the idea is to be able to pass field values from page1, thru page2 on to
page3.. e.g. page 1 asks for personal details, page2 asks for, say,
shipping address and page 3 will take all values from page1 and 2 and
process them..
That's the concept. It's been in place with our site for years with
original ASP, but now we're updating to .NET it's showing it's age. The
problem is I'm not sure I have time to re-write the while things, though
it might take as long as converting it.. who knows.

Kevin
Kevin Jones wrote:
How are you transferring control from the first form to the second?
Kevin Blount wrote:
Aug 28 '06 #6
Sure,

but how is control passed from page to page? Do you have links on page
one that reference page 2, then a link on page 2 that references page 3;
or are you using Server.Transfer or a redirect or something else?

A quick glance at the code here doesn't show anything (or am I missing it?),

Kevin

Kevin Blount wrote:
Kevin,

My pages contain the following:
form on page1
<form runat="server" method="post" name="EventForm" id="EventForm">
<% member_org_type_option1.Value =
commonText["organization_option_1b"].ToString(); %>
<% member_org_type_option1.Text =
commonText["organization_option_1b"].ToString(); %>
<% member_org_type_option2.Value =
commonText["organization_option_3"].ToString(); %>
<% member_org_type_option2.Text =
commonText["organization_option_3"].ToString(); %>
<% member_org_type_option3.Value =
commonText["organization_option_2b"].ToString(); %>
<% member_org_type_option3.Text =
commonText["organization_option_2b"].ToString(); %>
<% member_org_type_option4.Value =
commonText["organization_option_8"].ToString(); %>
<% member_org_type_option4.Text =
commonText["organization_option_8"].ToString(); %>
<asp:DropDownList ID="member_org_type" runat="server"
CssClass="smallFont" Width="300">
<asp:ListItem ID="member_org_type_option1" runat="server"></asp:ListItem>
<asp:ListItem ID="member_org_type_option2" runat="server"></asp:ListItem>
<asp:ListItem ID="member_org_type_option3" runat="server"></asp:ListItem>
<asp:ListItem ID="member_org_type_option4" runat="server"></asp:ListItem>
</asp:DropDownList>
</form>
page2:
simply has -
<asp:HiddenField ID="member_org_type"></asp:Hiddenfield>

the idea is to be able to pass field values from page1, thru page2 on to
page3.. e.g. page 1 asks for personal details, page2 asks for, say,
shipping address and page 3 will take all values from page1 and 2 and
process them..
That's the concept. It's been in place with our site for years with
original ASP, but now we're updating to .NET it's showing it's age. The
problem is I'm not sure I have time to re-write the while things, though
it might take as long as converting it.. who knows.

Kevin
Kevin Jones wrote:
>How are you transferring control from the first form to the second?
Kevin Blount wrote:
Aug 28 '06 #7
Hi, I see what you mean now. The form is submitted via a JavaScript
function instigated by clicking on an <asp:Button>, like this:

<% if (eventAction.ToUpper() == "INTEREST")
{
formAction = "page3.aspx";
}
else if (eventDetails["chargeable"] == true)
{
//getSecureURL method adds "https" to the URL
formAction = getSecureURL("page2.aspx");
}
else
{
formAction = "page2.aspx";
}
%>
....
<%
EventForm_btn.Attributes.Add("onclick","checkForm( this.form,'" +
formAction +"');return false;");
%>
<asp:Button ID="EventForm_btn" runat="server"></asp:Button>

Then assuming the JavaScript function "checkForm" doesn't find any blank
required fields, it sets the form action equal to "formAction", and
submits it.

I have built a workaround, where fields on page1 are named thus:

<asp:DropDownList ID="member_organization_type_page1" runat="server"
CssClass="smallFont" Width="300">

...and then on page2 I add those to alternatively name hidden fields, thus:

<% if (Request["member_organization_type_page1"] != null) {
member_organization_type.Value =
Request.Form["member_organization_type_page1"].ToString(); } %>
<asp:HiddenField ID="member_organization_type" runat="server"
Value=""></asp:hiddenfield>

it's certainly not the solution I was looking for, and if there is a
better one I'd like to implement it, but times moving on and deadlines
are closing in hehe, so I needed to get something in place, so I can
move on with the rest of page2.

I hope this info is what you were asking for..

Kevin B
Kevin Jones wrote:
Sure,

but how is control passed from page to page? Do you have links on page
one that reference page 2, then a link on page 2 that references page 3;
or are you using Server.Transfer or a redirect or something else?

A quick glance at the code here doesn't show anything (or am I missing
it?),

Kevin

Kevin Blount wrote:
>Kevin,

My pages contain the following:
form on page1
<form runat="server" method="post" name="EventForm" id="EventForm">
<% member_org_type_option1.Value =
commonText["organization_option_1b"].ToString(); %>
<% member_org_type_option1.Text =
commonText["organization_option_1b"].ToString(); %>
<% member_org_type_option2.Value =
commonText["organization_option_3"].ToString(); %>
<% member_org_type_option2.Text =
commonText["organization_option_3"].ToString(); %>
<% member_org_type_option3.Value =
commonText["organization_option_2b"].ToString(); %>
<% member_org_type_option3.Text =
commonText["organization_option_2b"].ToString(); %>
<% member_org_type_option4.Value =
commonText["organization_option_8"].ToString(); %>
<% member_org_type_option4.Text =
commonText["organization_option_8"].ToString(); %>
<asp:DropDownList ID="member_org_type" runat="server"
CssClass="smallFont" Width="300">
<asp:ListItem ID="member_org_type_option1" runat="server"></asp:ListItem>
<asp:ListItem ID="member_org_type_option2" runat="server"></asp:ListItem>
<asp:ListItem ID="member_org_type_option3" runat="server"></asp:ListItem>
<asp:ListItem ID="member_org_type_option4" runat="server"></asp:ListItem>
</asp:DropDownList>
</form>
page2:
simply has -
<asp:HiddenField ID="member_org_type"></asp:Hiddenfield>

the idea is to be able to pass field values from page1, thru page2 on
to page3.. e.g. page 1 asks for personal details, page2 asks for, say,
shipping address and page 3 will take all values from page1 and 2 and
process them..
That's the concept. It's been in place with our site for years with
original ASP, but now we're updating to .NET it's showing it's age.
The problem is I'm not sure I have time to re-write the while things,
though it might take as long as converting it.. who knows.

Kevin
Kevin Jones wrote:
>>How are you transferring control from the first form to the second?
Kevin Blount wrote:
Aug 29 '06 #8
So the problem is that a form expects to postback to itself only and, as
you saw, has various checks in place to make sure that works.

If you are using ASP2 try using the Cross Page Postback feature.

To page 1 add an

<asp:Button runat="server" PostBackUrl="~/page2.aspx" etc />

Kevin
Kevin Blount wrote:
Hi, I see what you mean now. The form is submitted via a JavaScript
function instigated by clicking on an <asp:Button>, like this:

<% if (eventAction.ToUpper() ==
"INTEREST")
{
formAction = "page3.aspx";
}
else if (eventDetails["chargeable"] == true)
{
//getSecureURL method adds "https" to the URL
formAction = getSecureURL("page2.aspx");
}
else
{
formAction = "page2.aspx";
}
%>
...
<%
EventForm_btn.Attributes.Add("onclick","checkForm( this.form,'" +
formAction +"');return false;");
%>
<asp:Button ID="EventForm_btn" runat="server"></asp:Button>

Then assuming the JavaScript function "checkForm" doesn't find any blank
required fields, it sets the form action equal to "formAction", and
submits it.

I have built a workaround, where fields on page1 are named thus:

<asp:DropDownList ID="member_organization_type_page1" runat="server"
CssClass="smallFont" Width="300">

..and then on page2 I add those to alternatively name hidden fields, thus:

<% if (Request["member_organization_type_page1"] != null) {
member_organization_type.Value =
Request.Form["member_organization_type_page1"].ToString(); } %>
<asp:HiddenField ID="member_organization_type" runat="server"
Value=""></asp:hiddenfield>

it's certainly not the solution I was looking for, and if there is a
better one I'd like to implement it, but times moving on and deadlines
are closing in hehe, so I needed to get something in place, so I can
move on with the rest of page2.

I hope this info is what you were asking for..

Kevin B
Kevin Jones wrote:
>Sure,

but how is control passed from page to page? Do you have links on page
one that reference page 2, then a link on page 2 that references page
3; or are you using Server.Transfer or a redirect or something else?

A quick glance at the code here doesn't show anything (or am I missing
it?),

Kevin

Kevin Blount wrote:
>>Kevin,

My pages contain the following:
form on page1
<form runat="server" method="post" name="EventForm" id="EventForm">
<% member_org_type_option1.Value =
commonText["organization_option_1b"].ToString(); %>
<% member_org_type_option1.Text =
commonText["organization_option_1b"].ToString(); %>
<% member_org_type_option2.Value =
commonText["organization_option_3"].ToString(); %>
<% member_org_type_option2.Text =
commonText["organization_option_3"].ToString(); %>
<% member_org_type_option3.Value =
commonText["organization_option_2b"].ToString(); %>
<% member_org_type_option3.Text =
commonText["organization_option_2b"].ToString(); %>
<% member_org_type_option4.Value =
commonText["organization_option_8"].ToString(); %>
<% member_org_type_option4.Text =
commonText["organization_option_8"].ToString(); %>
<asp:DropDownList ID="member_org_type" runat="server"
CssClass="smallFont" Width="300">
<asp:ListItem ID="member_org_type_option1"
runat="server"></asp:ListItem>
<asp:ListItem ID="member_org_type_option2"
runat="server"></asp:ListItem>
<asp:ListItem ID="member_org_type_option3"
runat="server"></asp:ListItem>
<asp:ListItem ID="member_org_type_option4"
runat="server"></asp:ListItem>
</asp:DropDownList>
</form>
page2:
simply has -
<asp:HiddenField ID="member_org_type"></asp:Hiddenfield>

the idea is to be able to pass field values from page1, thru page2 on
to page3.. e.g. page 1 asks for personal details, page2 asks for,
say, shipping address and page 3 will take all values from page1 and
2 and process them..
That's the concept. It's been in place with our site for years with
original ASP, but now we're updating to .NET it's showing it's age.
The problem is I'm not sure I have time to re-write the while things,
though it might take as long as converting it.. who knows.

Kevin
Kevin Jones wrote:
How are you transferring control from the first form to the second?
Kevin Blount wrote:
Aug 29 '06 #9
Hi Kevin,

Thanks again for the replies.. it's a great help!

I did try to use the PostBackUrl attribute, but had some trouble with
it, so reverted to using JavaScript.

The code I pasted in my last email had one line missing; a commented out
line that was as attempt to change the PostBackUrl of the button/form,
based on the If statement you saw that goes to page2.aspx or page3.aspx

//EventForm_btn.PostBackUrl = formAction;

I couldn't find the right syntax to dynamically change the PostBackUrl,
or any examples/definitions for this when googling it.

any clues on how to change the PostBackUrl based on the script I showed
you last night?

Kevin

Kevin Jones wrote:
So the problem is that a form expects to postback to itself only and, as
you saw, has various checks in place to make sure that works.

If you are using ASP2 try using the Cross Page Postback feature.

To page 1 add an

<asp:Button runat="server" PostBackUrl="~/page2.aspx" etc />

Kevin

Aug 29 '06 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: Prog-M | last post by:
Hi. I'm trying to create a login page in asp.net using information from an XML document. (visual basic) I've tried Rowfilter to find a cell with the 'username' and then match this with the...
1
by: BT Openworld | last post by:
I've just had to upgrade to Access 2003. Our company's main sales database started in Access V1.0 and has progressed through V2.0 and 97 without problems. I've converted it to 2003 format and have...
0
by: infofox | last post by:
In-Depth ASP.NET using ADO.NET By John Godel In this article we will discuss a number of ways to retrieve, show, and update data with ASP.NET forms using ADO.NET. Also, we will have a clear...
3
by: Hardik Shah | last post by:
Hi, I am calling an ASP.Net page from an ASP classic application but need the .Net page to have access to ASP classic's session variables. I am using HTTPWebRequest to call ASP classic page...
1
by: Robert Fitzpatrick | last post by:
I am running PostgreSQL 7.4.5 and have a trigger on a table called tblriskassessors which inserts, updates or delete a corresponding record in tblinspectors by lookup of a contact id and license...
1
by: hgriva | last post by:
Hi, i have a question ------------------------------------- i have 2 tables user_security and customer table structures ----------------------------- user_security
9
by: Kevin Blount | last post by:
Here's the code I tried, and found it failed... <form runat="server" method="post" name="CreditCardForm" id="CreditCardForm"> <% foreach (object item in Request.Form) { if...
0
by: OldStd | last post by:
Updating data using 2 data sets I am having some problems in updating the database using two datasets as suggested by someone. 1. Data is displayed in a data grid from a dataset generated using...
8
by: ak | last post by:
Hi Guys, I was just wondering whether it is possible to translate JSP pages into ASP pages using XSLT. What I want is to be able to open a currently available website developed in JSP in a...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.