Should this be a bug or not - ASP.NET Request parameter - asp.net

I posted a number of bugs on Microsoft site and while they were real bugs, MSFT will close it as design [And I figured most people favour MSFT anyways]. Here is one that I am sure they will clasify as by design but to me this is a serious bug.
This is all I have in ASPX page (NET 3.5).
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Submit" /><br />
<asp:Label ID="lblOutput" runat="server" Text="Label"></asp:Label>
Codebehind
protected void Page_Load(object sender, EventArgs e)
{ /* this works */
if (IsPostBack)
{
string txt = string.Empty;
txt = Request.Params["TextBox1"];
lblOutput.Text = "You entered : " + txt;
}
}
protected void Button1_Click(object sender, EventArgs e)
{ /* this does not */
string txt = string.Empty;
txt = Request.Params["TextBox1"];
lblOutput.Text = "You entered : " + txt;
}
Now if you include another simple HTML textbox (Not ASP) like this
<input type="text" id="mytextbox" name="mytextbox" /> // still it below the existing one
txt = Request.Params["mytextbox"]; // change to this line instead of TextBox1
Then it works in both places.

protected void Button1_Click(object sender, EventArgs e)
{ /* Now this works which is weird but it does */
If(IsPostback)
{
string txt = string.Empty;
txt = Request.Params["TextBox1"];
lblOutput.Text = "You entered : " + txt;
}
}
I therefore should close the question.

If you are forced to use the Request object instead normal asp:* controls, use it like this:
txt = Request["TextBox1"];
It will check all the HttpRequest collections.
The QueryString, Form, Cookies, or ServerVariables collection member
specified in the key parameter. If the specified key is not found,
then null is returned.

That is really fundamental stuff you're doing in that example, so I highly doubt it's a bug. From the example, it looks like you're going against the grain:
Markup
<asp:PlaceHolder ID="PlaceHolder1" runat="server">
<asp:TextBox ID="TextBox1" runat="server" />
<asp:TextBox ID="TextBox2" runat="server" />
<asp:TextBox ID="TextBox3" runat="server" />
<asp:TextBox ID="TextBox4" runat="server" />
...
</asp:PlaceHolder>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Submit" /><br />
<asp:Label ID="lblOutput" runat="server" Text="Label"></asp:Label>
Code-behind
protected void Button1_Click(object sender, EventArgs e)
{
foreach (TextBox txtCtrl in PlaceHolder1.Controls.OfType<TextBox>())
{
//append the textbox value to the label
lblOutput.Text += String.Format("{0}<br/>", txtCtrl.Text);
}
}
protected void Button1_Click(object sender, EventArgs e)
{
List<TextBox> txtList = PlaceHolder1.Controls.OfType<TextBox>().ToList();
for (int ctrlIndex = 0; ctrlIndex < txtList.Count; ctrlIndex++)
{
TextBox txtCtrl = txtList.ElementAt(ctrlIndex);
if (txtCtrl != null)
{
lblOutput.Text += String.Format("{0}<br/>", txtCtrl.Text);
}
}
}

Related

Clearing a Password text box in ASP.NET

I have two boxes one with username [text] and one with password [password].
I'm using this code in the CodeBehind:
protected void Button2_Click1(object sender, EventArgs e)
{
TextBox1.Text = "";
TextBox2.Text = "";
}
[asp.net/html]
<asp:TextBox ID="TextBox2" runat="server" Height="24px" Style="text-align: center" Width="209px" TextMode="Password"></asp:TextBox>
The first text box clears but the second doesn't. Is there a special way to do this in ASP.NET?
Hi I don't know what happend in your HTML but I wrote this:
<asp:TextBox ID="TextBox1" runat="server" ></asp:TextBox>
<asp:TextBox ID="TextBox2" runat="server" Height="24px" Style="text-align: center" Width="209px" TextMode="Password"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
And the codebehind:
protected void Button1_Click(object sender, EventArgs e)
{
TextBox1.Text = "";
TextBox2.Text = "";
}
And It works, the only thing is when the button does not have the onclick only It will clean the password texbox, check it and maybe this is your problem.
When the TextMode property of the <asp:TextBox /> is set to Password the value set in the Text property will not display at runtime, Or you can say it won't have any effect to set the Text property. This is by design to prevent the unmasked password from being displayed in the HTML source of the page.
As a solution, use this::
this.TextBox2.Attributes["value"] = "";
OR::
this.TextBox2.Attributes.Add("value", "");
Check here for full details.
textbox1.text = string.empty;
textbox2.text = string.empty;

How to get Reference to the label in repeater item in code behind

<asp:repeater id="rpt" run="server">
<ItemTemplate>
<asp:LinkButton id="Delete" runat="server" OnCommand="Delete_Command"></asp:linkButton>
<asp:label id="lblMessage" run="server">
</ItemTemplate>
</asp:repeater>
Code Behind:
protected void Delete_Command(object sender, CommandEventArgument e)
{
}
how i get the reference to the "lblMessage" in Delete_Command.
Try this:
protected void Delete_Command(object sender, CommandEventArgs e)
{
LinkButton button = (LinkButton)sender;
Label label = (Label)button.NamingContainer.FindControl("lblMessage");
// do something with the label
}
If you:
Have bound the repeater
Have ViewState enabled
Do not re-bind the repeater earlier in the post back
this should work. If not, please verify that the id of the label is indeed exactly the same as in the ...FindControl("lblMessage");. Also make sure that runat="server" is set on all the controls involved.
Edit: One more thing to check: Search the markup file (the .aspx file) and check if there are any other controls that also use the same event in the code behind. If another control is using the same event handler and that control is not in the repeater, the label will not be found.
means are you want find a lable in Delete_Command event?
in aspx
<asp:Repeater ID="rpt" runat="server">
<ItemTemplate>
<asp:LinkButton ID="Delete" runat="server" OnCommand="Delete_Command"></asp:LinkButton>
<asp:Label ID="lblMessage" run="server">
</ItemTemplate>
</asp:Repeater>
in aspx.cs
protected void Delete_Command(object sender, CommandEventArgs e)
{
foreach (RepeaterItem item in rpt.Items)
{
Label lblMessage = item.FindControl("lblMessage") as Label;
if (lblMessage != null)
{
lblMessage.Text = "";
}
}
}
If You want to make it in your way use following code in
protected void Repeater1_ItemCommand(object source, CommandEventArgs e)
{
(((LinkButton)source).NamingContainer).FindControl("lblName")
}
Another approach.. But something that you can buy
aspx
<asp:Repeater ID="Repeater1" runat="server"
onitemcommand="Repeater1_ItemCommand">
<ItemTemplate>
<asp:Label ID="lblName" runat="server" Text='<%=Eval("Name") %>' ></asp:Label>
<asp:LinkButton runat="server" CommandName="Delete_Command" Text="sd"></asp:LinkButton>
</ItemTemplate>
</asp:Repeater>
.cs
protected void Delete_Command(object sender, CommandEventArgument e)
{
if(e.CommandName != null)// Conditional Check
{
Label label = e.Item.FindControl("lblMessage");
// do something with the label
}
}

ASP.NET - Finding Label Control in a GridView

I'm having a problem trying to find a label control that is inside a GridView.
Please see my codes below:
<asp:GridView ID="MyGridView" runat="server">
<Columns>
<asp:TemplateField HeaderText="Date">
<ItemTemplate>
<asp:TextBox runat="server" ID="txtDate" MaxLength="10" Width="70" />
<asp:ImageButton ID="imgScoreDate" runat="server" ImageUrl="~/images/calendar.gif" />
<ajaxtoolkit:CalendarExtender ID="txtDate_CalendarExtender" runat="server" Enabled="True" Format="MM/dd/yyyy" TargetControlID="txtDate" PopupButtonID="imgDate" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Name">
<ItemTemplate>
<asp:Label ID="lblName" runat="server"/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
And here is my .cs file:
protected void LoadGridView()
{
//Do something else
foreach (GridViewRow row in MyGridView.Rows)
{
//Tried A
System.Web.UI.WebControls.Label lblName = row.FindControl("lblName") as System.Web.UI.WebControls.Label;
lblName.Text = "Name";
//Tried B
((System.Web.UI.WebControls.Label)row.FindControl("lblName")).Text = "Name";
}
}
I debug this code and it seems to work fine because my breakpoint is being hit each time the debugger runs. It even loops through my foreach block the same count as to how many rows my GridView has.
But I don't understand why my lblName control doesn't get the "Name" text as a value? Am I missing anything here? I tried both //Tried A and //Tried B methods but they both doesn't update my label's text.
Any help would be appreciated!
Thanks! Cheers!
You want to call LoadGridView inside PreRender. Basically, you want to call it after GridView is bound with data.
protected void Page_PreRender(object sender, EventArgs e)
{
LoadGridView();
}
Look at PreRender event of ASP.NET Page Life Cycle.
On your gridview add:
<asp:GridView OnRowDataBound="MyGridView_RowDataBound" ... />
Then define MyGridView_RowDataBound:
void CustomersGridView_RowDataBound(Object sender, GridViewRowEventArgs e)
{
Label l = (Label) e.Row.FindControl("lblName");
}
What I think is happening is the control is not recreated server side in its current spot.
try this
on .aspx page
<asp:GridView ID="MyGridView" runat="server"
onrowdatabound="MyGridView_RowDataBound" .../>
code behind ::
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
LoadGridView();
}
}
void LoadGridView()
{
DataTable dt = new DataTable();
// dt= call ur database method to get data
MyGridView.DataSource = dt;
MyGridView.DataBind();
}
protected void MyGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
Label lbl_Name = (Label)e.Row.FindControl("lblName");
lbl_Name.Text = "Name";
}
}
cheers!

Why isn't the if-statement in this ASP.Net Code-behind working?

I have a dropdown list populated with integers. When "1" is selected, a text box is supposed to appear. I have done something similar in another project, but it won't work here.
Any help is appreciated.
C# code:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ddlHowMany.Items.Add(new ListItem("0", "0"));
ddlHowMany.Items.Add(new ListItem("1", "1"));
ddlHowMany.Items.Add(new ListItem("2", "2"));
ddlHowMany.Items.Add(new ListItem("3", "3"));
}
}
protected void ddlHowMany_SelectedIndexChanged(object sender, EventArgs e)
{
// int howMany = Convert.ToInt32(ddlHowMany.SelectedValue);
if (ddlHowMany.SelectedIndex == 1)
{
txtGraphic1Desc.Visible = true;
}
}
Default.aspx code:
<asp:DropDownList ID="ddlHowMany" runat="server"
onselectedindexchanged="ddlHowMany_SelectedIndexChanged"
style="margin-left: 8px" Width="50px">
</asp:DropDownList>
<br />
<br />
<asp:TextBox ID="txtGraphic1Desc" class="descriptions" runat="server" Height="92px"
TextMode="MultiLine"
Width="328px" Font-Names="Trebuchet MS" Visible="False">Description of graphic #1</asp:TextBox>
You want to add autoPostBack="true" to dropdownlist.
<asp:DropDownList ID="ddlHowMany" runat="server"
onselectedindexchanged="ddlHowMany_SelectedIndexChanged"
style="margin-left: 8px" Width="50px" AutoPostBack="true">

how to disable server side validation on asp.net web forms from browser?

I wanted to disable asp.net validation server controls from browser. I checked online but did not find any way to disable the server side validation; it can be disabled only on the client side using JS/jQuery.
Here is the scenario: I have a checkbox and selecting which displays a set of text boxes. Only if the checkbox is checked, required field validator should fire for the text boxes. I don't want to call a postback on checkbox. Actually those chceck boxes will be generated with jQuery templating so postback is not an option to enable disable validtion.
I would like to know whether there is any way we can enable disable the .CausesValidation property for the controls from browser using some setting? Or is there a way to capture the controls which are to be considered for validation slectively in some event before page_load?
[Update]
Based on Accepted answer, here is my solution:
<form id="form1" runat="server">
<div>
<asp:TextBox ID="textbox1" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="req1" ControlToValidate="textbox1" runat="server"
ErrorMessage="enter text"></asp:RequiredFieldValidator>
<asp:TextBox ID="textbox2" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="req2" ControlToValidate="textbox2" runat="server"
ErrorMessage="enter text for 2"></asp:RequiredFieldValidator>
<asp:CheckBox ID="check1" runat="server" Text="choose" />
<asp:Button ID="submitBtn" runat="server" OnClick="submitBtn_Click" Text="submit" />
<asp:CustomValidator ID="cvBox" runat="server" ErrorMessage="Error" ValidationGroup="prueba"
OnServerValidate="Validarcaja"></asp:CustomValidator>
<asp:ValidationSummary ID="summary" runat="server" />
</div>
</form>
protected void Page_Load(object sender, EventArgs e)
{
req1.Enabled = false;
req2.Enabled = false;
}
protected void submitBtn_Click(object sender, EventArgs e)
{
if (Page.IsPostBack)
{
Page.Validate();
if (Page.IsValid)
{
Response.Write("valid form");
}
else
{
Response.Write("invalid form");
}
}
}
protected void Validarcaja(object source, ServerValidateEventArgs args)
{
if (check1.Checked)
{
req1.Enabled = true;
req1.Validate();
}
}
The solution for me would be to use a CustomValidator with a OnServerValidate method.
In the OnServerValidate method I would check if the checkbox is checked, in that case I would verify if the textboxes are filled. It is not necessary to do any change in the CausesValidation property.
The only condition is not to include the property "ControlToValidate". A CustomValidator does not fire if the textbox is empty that's why.
So the code would be like this:
<asp:ValidationSummary ID="vs" runat="server" ValidationGroup="prueba" />
<asp:CheckBox ID="chb" runat="server" Text="Check" />
<asp:TextBox ID="txbBox" runat="server"></asp:TextBox>
<asp:CustomValidator ID="cvBox" runat="server" ErrorMessage="Error" ValidationGroup="prueba"
OnServerValidate="Validarcaja"></asp:CustomValidator>
<asp:Button ID="btn" runat="server" Text="Prueba" />
And the codebehind:
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
Page.Validate();
}
}
protected void Validarcaja(object source, ServerValidateEventArgs args)
{
if (chb.Checked)
{
if (txbBox.Text == String.Empty)
{
cvBox.IsValid = false;
}
}
}

Resources