How can I access an object inside of an asp:LoginView - asp.net

I have a LoginView on a site master page that displays the username of the logged-in user. I modifies it to make the username a link to that user's settings, using a LinkButton.
I need to be able to conditionally enable or disable the LinkButton from within Page_Load. How do I get a reference to the LinkButton?
The LinkButton doesn't appear in the designer.cs file, but the LoginView does. I have tried looking at its controls property in the debugger and also tried using FindControl(LinkButton's ID) but that returns null.
--Jacob

You can't use the LogIn "as is", you have to create a LayoutTemplate inside the control.
<asp:Login ID="LoginUser" runat="server">
<%--the LayoutTemplate must include controls (with Text property)
with ID values UserName and Password--%>
<LayoutTemplate>
Your stuff here. Textboxes for user name and password, etc...
</LayoutTemplate>
</asp:Login>
Then you can find a control by
Label myErrorLabel = (Label)LoginUser.FindControl("logInErrorDetails");

Make sure that LinkButton is Asp.Net server control with "runat="server" attribute. If it is a server control then it should appear in your designer.cs file. Once it appeared in designer.cs file, you can access that control by its name or using FindControl method.
Some times Visual Studio IDE creates problem and it does not update desinger.cs file. Try to switch between designer view, mark up view and code view. It will update designer.cs file if the markup is correct.

Related

Accessing text boxes in a web control on a master page

I need to access multiple textboxes on a master page. The textboxes are declared in a separate web control and it won't let me call the names of the textboxes so I can populate them with data. I have multiple textboxes like I said, but for example, when I try to write to txtName it will not let me even though when I click on the Design View it says it is there.
Can anybody help me out?
Expose the text boxes inside the web control as properties.
In webcontrol.ascx
<asp:TextBox runat="server" id="txtName" />
In webcontrol.ascx.cs
public virtual TextBox TxtName { get {return txtName;} //note capitalization
Then do the same thing in the master page to expose the web control.
In masterpage.master
<uc1:MyWebControl runat="server" id="MyWebControl1" />
In mastermage.master.cs
public virtual MyWebControl myWebControl{get {return myWebControl1;}}
Then make your master page strongly typed from the content page by adding a MasterType directive.
In default.aspx
<%# MasterType TypeName="MyMasterPageClass" />
Then you can access it from your content page code behind. In default.aspx.cs
Master.myWebControl.TxtName.Text="Hello, world!";
The reason it's necessary to do this is that controls declared on .aspx, .ascx, and .master pages are protected instead of public and there's no way (as of right now) to change them that I'm aware of. So we can use properties to expose these controls as public.

Where is the code that runs when a button is clicked in ASP.NET

I'm trying to learn basic aspects of ASP.NET by analyzing the default Web Site project with Visual Studio 2010.
In the Register.aspx page there are fields for user registration and this button:
<asp:Button ID="CreateUserButton" runat="server" CommandName="MoveNext"
Text="Create User" ValidationGroup="RegisterUserValidationGroup"/>
The button does register an user, but I can't find the piece of code that is run and even less how code was associated to that button. I've tried searching the solution for all the identifier keywords and found nothing relevant. Searching on the web mentions a Button.OnClick method that I also can't find.
Any info on the basic aspects of ASP.NET will help me; thanks in advance.
Edit: hierarchically, the button is inside:
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<asp:CreateUserWizard ID="RegisterUser" runat="server" EnableViewState="false" OnCreatedUser="RegisterUser_CreatedUser">
<WizardSteps>
<asp:CreateUserWizardStep ID="RegisterUserWizardStep" runat="server">
<ContentTemplate>
<div class="accountInfo">
<p class="submitButton">
There is a RegisterUser_CreatedUser method on the code behind and it does:
protected void RegisterUser_CreatedUser(object sender, EventArgs e)
{
FormsAuthentication.SetAuthCookie(RegisterUser.UserName, false /* createPersistentCookie */);
string continueUrl = RegisterUser.ContinueDestinationPageUrl;
if (String.IsNullOrEmpty(continueUrl))
{
continueUrl = "~/";
}
Response.Redirect(continueUrl);
}
I was expecting some kind of inserting of user data on a database. I wonder, is this all that the button does?
The button you are looking it should be in CreateUserWizardStep control. I don't know much about this control but probably control looks for a child button having CommandName = "MoveNext", then it hooks for its click event.
Try changing the CommandName to something else like "test", it should NOT hit the breakpoint on RegisterUser_CreatedUser event.
Also note that CreatedUser <- event is telling that user is created, now the rest of the code is just authenticating the same user. Behind that, the user is already been created and saved in database.
If you also look in the web.config you will find this ConnectionString
<connectionStrings>
<add name="ApplicationServices"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient" />
</connectionStrings>
Since you are using the Visual Studio's Default Web Application project, these all things are already done by Visual Studio for you.
An aspx page will also have a "code behind" file with the same name but a different extension (the letters after the dot) which depends on the language it's written in. Visual basic files have a .vb extension while C# files have a .cs extension.
Try looking for Register.vb or Register.cs and see if that's more fruitful.
If you're using a development environment like Visual Studio, you'll probably find that in the Solution Explorer you can click to expand the aspx file and see its code behind file underneath. If you're not, you might want to pick up a copy of the free express edition:
http://www.visualstudio.com/en-US/products/visual-studio-express-vs
When you find the code-behind, look for method called "MoveNext" - that's the code that'll run when you click the button, as specified by the CommandName attribute of the asp: Tag.
You've complicated a couple of things and you are completely not at fault but partly the project templates which comes with VS 2010 IDE. Let me try to help you one by one:
Learning basics of ASP.Net : For this you should be using "ASP.NET Empty Web Application" project template present in Visual Studio 2010. You've started with "ASP.NET Web Application" project template which has complicated things for
you. To start afresh "ASP.NET Web Application" looks the obvious choice for anyone though but it comes with a precooked boiler-plate code meant for ASP.NET membership forms authentication and its associated controls which is the root cause of all your confusion. To get started with the basics take the "ASP.NET Empty Web Application" project template I've suggested above and then add a new "Web Form" and then add various basic server web controls like button or text box to get started with concepts like event handling and code behind stuff.
Your other problem -
"The button does register an user, but I can't find the piece of code
that is run and even less how code was associated to that button"
That is because the button that you are seeing on Register.aspx page is
NOT an individual server web control but it is part of a composite control asp:CreateUserWizard instead. All the events of various controls be it a button, label or text box which are part of the asp:CreateUserWizard composite control is handled by the parent composite control asp:CreateUserWizard. You will NOT find all that code in your code behind file as this is present in System.Web.dll which is referenced in your project.
Since all the control events present on the composite control are handled by a common function written inside the code of composite control it has to distinguish exactly which control was clicked by the user (to take an appropriate action) which caused the current page post back for which CommandName property comes into picture. There is a switch case statement inside that common function for parent composite control which uses the CommandName property.
So essentially what happened is when you tried to start understanding basics of ASP.Net server web controls and event handling you actually got into the path of understanding ASP.Net Membership & role web server controls & providers which might be comparatively tough to understand and grasp initially. Hope this helps you to get started and further your understanding on ASP.Net world.

ASP.net content tags, and the id attribute

I've made a few master pages in visual studio, and then a few implementing pages, and Visual Studio sticks ID attributes onto all of my tags:
<asp:Content ID="Content1" ContentPlaceHolderID="OtherContent" ></asp:Content>
What gives with the IDs? What are they good for? How do I access them from the code behind?
All controls that run on the server must have an ID attribute as a unique identifier. They are good for finding child controls and keeping the control hierarchy in place. If you have a TextBox that sits in a Panel that sits in an UpdatePanel that's in a WebUserControl that's in a ContentPlaceHolder that's in a Page, then all it takes is one of them not to have a proper ID attribute in order keep the connection between TextBox and Page.
In order to access it from the code behind you need to have the runat="server" attribute set on this tag.

How to get access to the input of textbox at aspx web page?

I am a starter for asp .net. On my webpage, there are a few textboxes and a submit botton. Is there a easy way to get access the data and use it to built an object ? The textboxes has there names and ids, there should be a way to get access them by names and ids.
Edit
this is normal html control
<input type="text" class="text-box" id=xxx />
if you want to access it in your codebehind file you need to add runat=server attribute to this
<asp:textbox>
Other one is server side control asp.net control not html control
I think its better you read out basic of asp.net before stating programming because this is very basic question you should know about
prev
step 1:
make use of asp.net Textbox
<asp:Textbox id="textbox1" runat="server"></asp:Textbox>
Step 2:
for asp.net you just need to write in you codebehind file
object.proertyname = texboxid.Text;
Read more : TextBox Class

How can you tell if form runat=server has been set?

When coding an Asp.Net page, you generally add a runat attribute in the aspx:
<form id="form1" runat="server">
Is it possible to tell in the code behind if the user hasn't done this i.e. they only did this:
<form id="form1">
Here the form has the id "form1" but in my case I don't know this. Code behind such as this is what I am looking for:
if(Page.HasForm)
{
}
You can only ever have one form tag with "runat=server" on it per .aspx page. All you have to do is to check to see if Page.Form is null or not. If it's null, then there's no form that has been marked to runat server.
if (Page.Form != null)
{
}
It's the runat="server" part that makes the .aspx page process an element and create a corresponding object on the server side. If a component is not running on the server, then it's not added to the page's control hierarchy.
var v = this.Form.TagName; //gets the name of the form that is maked as runat.
Of course if its not maked as runat then your code behind won't run anyway...
When you code in C# or Visual Basic in the code page, you will not have access to the object that do not have the runat=server option set.
You can easily access all the controls from a page using the me.controls page or something of the sort (I don't know the exact code but it's close to this) and check the type of the control to get the form.
Why do you need to know that? If a page does not have a runat=server form, it can't really be used as a server page.
You'd be able to access the form from the codebehind:
Response.Write(form1.Name);
Without the runat="server", you'd just get a compiler error.

Resources