Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / untmp / whidbey / QFE / ndp / fx / src / xsp / System / Web / UI / WebControls / LoginView.cs / 3 / LoginView.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.UI.WebControls { using System.Collections; using System.ComponentModel; using System.Security.Permissions; using System.Security.Principal; using System.Web.Security; using System.Web.UI; ////// Renders exactly one of its templates, chosen by whether a user is logged in /// and the roles that contain the user. /// [ Bindable(false), ParseChildren(true), PersistChildren(false), Designer("System.Web.UI.Design.WebControls.LoginViewDesigner," + AssemblyRef.SystemDesign), DefaultProperty("CurrentView"), DefaultEvent("ViewChanged"), Themeable(true), ] [AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)] public class LoginView : Control, INamingContainer { private RoleGroupCollection _roleGroups; private ITemplate _loggedInTemplate; private ITemplate _anonymousTemplate; private int _templateIndex; private const int anonymousTemplateIndex = 0; private const int loggedInTemplateIndex = 1; private const int roleGroupStartingIndex = 2; private static readonly object EventViewChanging = new object(); private static readonly object EventViewChanged = new object(); ////// Template shown when no user is logged in. /// [ Browsable(false), DefaultValue(null), PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(LoginView)), ] public virtual ITemplate AnonymousTemplate { get { return _anonymousTemplate; } set { _anonymousTemplate = value; } } [ Browsable(true), ] public override bool EnableTheming { get { return base.EnableTheming; } set { base.EnableTheming = value; } } [ Browsable(true), ] public override string SkinID { get { return base.SkinID; } set { base.SkinID = value; } } ////// Copied from CompositeControl. This control does not extend CompositeControl because it should not be a WebControl. /// public override ControlCollection Controls { get { EnsureChildControls(); return base.Controls; } } ////// Copied from CompositeControl. This control does not extend CompositeControl because it should not be a WebControl. /// Does not call Base.DataBind(), since we need to call EnsureChildControls() between /// OnDataBinding() and DataBindChildren(). /// public override void DataBind() { // Do our own databinding OnDataBinding(EventArgs.Empty); EnsureChildControls(); // Do all of our children's databinding DataBindChildren(); } ////// Template shown when a user is logged in, but the user is not in any role associated with a template. /// [ Browsable(false), DefaultValue(null), PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(LoginView)), ] public virtual ITemplate LoggedInTemplate { get { return _loggedInTemplate; } set { _loggedInTemplate = value; } } ////// Maps groups of roles to templates. /// [ WebCategory("Behavior"), MergableProperty(false), Themeable(false), Filterable(false), PersistenceMode(PersistenceMode.InnerProperty), WebSysDescription(SR.LoginView_RoleGroups) ] public virtual RoleGroupCollection RoleGroups { get { if (_roleGroups == null) { _roleGroups = new RoleGroupCollection(); } return _roleGroups; } } ////// Index of the template rendered on the previous page load. Saved in ControlState. /// 0: AnonymousTemplate /// 1: LoggedInTemplate /// >=2: RoleGroup template with index n-2 /// private int TemplateIndex { get { return _templateIndex; } set { if (value != TemplateIndex) { OnViewChanging(EventArgs.Empty); _templateIndex = value; ChildControlsCreated = false; OnViewChanged(EventArgs.Empty); } } } ////// Raised after the view is changed. /// [ WebCategory("Action"), WebSysDescription(SR.LoginView_ViewChanged) ] public event EventHandler ViewChanged { add { Events.AddHandler(EventViewChanged, value); } remove { Events.RemoveHandler(EventViewChanged, value); } } ////// Raised before the view is changed. Not cancellable, because the view is changed /// when the logged-in user changes, and it wouldn't make sense to cancel this. /// [ WebCategory("Action"), WebSysDescription(SR.LoginView_ViewChanging) ] public event EventHandler ViewChanging { add { Events.AddHandler(EventViewChanging, value); } remove { Events.RemoveHandler(EventViewChanging, value); } } ////// Instantiate the appropriate template. /// protected internal override void CreateChildControls() { Controls.Clear(); // For the first request, set _templateIndex now, so the correct template is // instantiated and we do not raise the ViewChanging/ViewChanged events. Page page = Page; if (page != null && !page.IsPostBack && !DesignMode) { _templateIndex = GetTemplateIndex(); } int templateIndex = TemplateIndex; ITemplate template = null; switch (templateIndex) { case anonymousTemplateIndex: template = AnonymousTemplate; break; case loggedInTemplateIndex: template = LoggedInTemplate; break; default: int roleGroupIndex = templateIndex - roleGroupStartingIndex; RoleGroupCollection roleGroups = RoleGroups; if (0 <= roleGroupIndex && roleGroupIndex < roleGroups.Count) { template = roleGroups[roleGroupIndex].ContentTemplate; } break; } if (template != null) { Control templateContainer = new Control(); template.InstantiateIn(templateContainer); Controls.Add(templateContainer); } } [ EditorBrowsable(EditorBrowsableState.Never), ] public override void Focus() { throw new NotSupportedException(SR.GetString(SR.NoFocusSupport, this.GetType().Name)); } ////// Loads the control state for those properties that should persist across postbacks /// even when EnableViewState=false. /// protected internal override void LoadControlState(object savedState) { if (savedState != null) { Pair state = (Pair)savedState; if (state.First != null) { base.LoadControlState(state.First); } if (state.Second != null) { _templateIndex = (int)state.Second; } } } protected internal override void OnInit(EventArgs e) { base.OnInit(e); if (Page != null) { Page.RegisterRequiresControlState(this); } } ////// Sets the TemplateIndex based on the current user. /// protected internal override void OnPreRender(EventArgs e) { base.OnPreRender(e); TemplateIndex = GetTemplateIndex(); // This is called in Control.PreRenderRecursiveInteral, but we need to call it again // since we may have changed the TemplateIndex EnsureChildControls(); } ////// Raises the ViewChanged event. /// protected virtual void OnViewChanged(EventArgs e) { EventHandler handler = (EventHandler)Events[EventViewChanged]; if (handler != null) { handler(this, e); } } ////// Raises the ViewChanging event. /// protected virtual void OnViewChanging(EventArgs e) { EventHandler handler = (EventHandler)Events[EventViewChanging]; if (handler != null) { handler(this, e); } } protected internal override void Render(HtmlTextWriter writer) { EnsureChildControls(); base.Render(writer); } ////// Saves the control state for those properties that should persist across postbacks /// even when EnableViewState=false. /// protected internal override object SaveControlState() { object baseState = base.SaveControlState(); if (baseState != null || _templateIndex != 0) { object templateIndexState = null; if (_templateIndex != 0) { templateIndexState = _templateIndex; } return new Pair(baseState, templateIndexState); } return null; } ////// Allows the designer to set the TemplateIndex, so the different templates can be shown in the designer. /// [SecurityPermission(SecurityAction.Demand, Unrestricted = true)] protected override void SetDesignModeState(IDictionary data) { if (data != null) { object o = data["TemplateIndex"]; if (o != null) { TemplateIndex = (int)o; // Note: we always recreate the child controls in the designer to correctly handle the case of // the currently selected role group being deleted. This is necessary because the // setter for TemplateIndex won't recreate the controls if the TemplateIndex is unchanged, // which is the case when deleting all but the last role group. [Fix for Bug 148406] ChildControlsCreated = false; } } } private int GetTemplateIndex() { if (!DesignMode && Page != null && Page.Request.IsAuthenticated) { IPrincipal user = LoginUtil.GetUser(this); int roleGroupIndex = -1; // Unlikely but possible for Page.Request.IsAuthenticated to be true and // user to be null. if (user != null) { roleGroupIndex = RoleGroups.GetMatchingRoleGroupInternal(user); } if (roleGroupIndex >= 0) { return roleGroupIndex + roleGroupStartingIndex; } else { return loggedInTemplateIndex; } } else { return anonymousTemplateIndex; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ImageCodecInfoPrivate.cs
- AbandonedMutexException.cs
- WebSysDefaultValueAttribute.cs
- _AuthenticationState.cs
- NgenServicingAttributes.cs
- ListViewItem.cs
- CroppedBitmap.cs
- DurableServiceAttribute.cs
- PersistenceException.cs
- StrictAndMessageFilter.cs
- QueryCoreOp.cs
- EventLogPermission.cs
- IODescriptionAttribute.cs
- NativeWrapper.cs
- ServiceHostingEnvironment.cs
- NGCPageContentSerializerAsync.cs
- CopyNodeSetAction.cs
- IItemContainerGenerator.cs
- TagPrefixInfo.cs
- MouseWheelEventArgs.cs
- DataGridViewCellToolTipTextNeededEventArgs.cs
- ContentPresenter.cs
- login.cs
- CodeGenerator.cs
- Oci.cs
- SystemDiagnosticsSection.cs
- FlowLayoutPanelDesigner.cs
- XMLSyntaxException.cs
- ResourcesGenerator.cs
- ScriptingAuthenticationServiceSection.cs
- OrderedDictionary.cs
- SessionStateItemCollection.cs
- DataGridPagerStyle.cs
- MemberProjectedSlot.cs
- CursorInteropHelper.cs
- GridViewRowEventArgs.cs
- AutoResetEvent.cs
- ToolStripHighContrastRenderer.cs
- MultiAsyncResult.cs
- InvalidDataException.cs
- DesignerActionHeaderItem.cs
- ColorTransformHelper.cs
- EdmItemError.cs
- WebScriptEnablingElement.cs
- DispatcherFrame.cs
- ProfileManager.cs
- HitTestWithGeometryDrawingContextWalker.cs
- CombinedHttpChannel.cs
- ServiceDesigner.xaml.cs
- BaseTreeIterator.cs
- FullTextLine.cs
- Utils.cs
- RouteUrlExpressionBuilder.cs
- SiteOfOriginContainer.cs
- DeclarationUpdate.cs
- LoadWorkflowAsyncResult.cs
- DataFormat.cs
- XmlReflectionImporter.cs
- IdentityValidationException.cs
- TemplatingOptionsDialog.cs
- SapiRecoContext.cs
- PresentationAppDomainManager.cs
- PropertyPath.cs
- Rect3DConverter.cs
- DataRelation.cs
- ValueTypeIndexerReference.cs
- Point3DCollection.cs
- WebPartMenu.cs
- XsdBuilder.cs
- X509ChainPolicy.cs
- XmlMembersMapping.cs
- Visitors.cs
- EncoderParameter.cs
- TimeZoneNotFoundException.cs
- CustomAttributeFormatException.cs
- ScriptingAuthenticationServiceSection.cs
- XamlPoint3DCollectionSerializer.cs
- FontUnitConverter.cs
- SortKey.cs
- DataGridViewRowsAddedEventArgs.cs
- MobileControlsSectionHandler.cs
- RectAnimationBase.cs
- Quaternion.cs
- SendMailErrorEventArgs.cs
- SearchForVirtualItemEventArgs.cs
- WebBrowserSiteBase.cs
- ColorConvertedBitmapExtension.cs
- GradientSpreadMethodValidation.cs
- Tokenizer.cs
- NavigatorInput.cs
- ReaderContextStackData.cs
- HttpRequestWrapper.cs
- DataGridViewTextBoxCell.cs
- XmlArrayItemAttributes.cs
- MessageQueueConverter.cs
- AutomationAttributeInfo.cs
- Exceptions.cs
- WindowsGraphicsWrapper.cs
- XmlILStorageConverter.cs
- OleDbFactory.cs