Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / fx / src / xsp / System / Web / UI / WebControls / LoginView.cs / 1 / 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;
}
}
}
}
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- BufferedOutputStream.cs
- StringResourceManager.cs
- BoolExpressionVisitors.cs
- ExpressionPrefixAttribute.cs
- TemplateNameScope.cs
- DataGridViewRowCollection.cs
- ChannelSinkStacks.cs
- HtmlTernaryTree.cs
- ChannelFactoryBase.cs
- COM2ColorConverter.cs
- TimelineGroup.cs
- WebPartDisplayMode.cs
- QueueAccessMode.cs
- GradientBrush.cs
- KeyMatchBuilder.cs
- ProcessThread.cs
- SoapConverter.cs
- ProcessMonitor.cs
- ArcSegment.cs
- Vector3DConverter.cs
- HttpProfileBase.cs
- SwitchElementsCollection.cs
- HttpInputStream.cs
- TypedDataSetSchemaImporterExtension.cs
- DeclarativeCatalogPart.cs
- XmlCompatibilityReader.cs
- LinqDataSourceUpdateEventArgs.cs
- CodeAccessPermission.cs
- SelectionPattern.cs
- Assembly.cs
- GeometryGroup.cs
- TimeoutHelper.cs
- FixedElement.cs
- SqlUnionizer.cs
- DataGridColumnCollection.cs
- EmbeddedMailObject.cs
- ApplicationInfo.cs
- EnumBuilder.cs
- RemoteWebConfigurationHost.cs
- ImageSource.cs
- UnitySerializationHolder.cs
- EndpointIdentity.cs
- SqlDataSourceSelectingEventArgs.cs
- WebDescriptionAttribute.cs
- StructuredTypeEmitter.cs
- DocumentAutomationPeer.cs
- WebBrowserHelper.cs
- FileStream.cs
- SHA1CryptoServiceProvider.cs
- WCFServiceClientProxyGenerator.cs
- SqlUtils.cs
- DesignerProperties.cs
- ThicknessAnimationBase.cs
- ButtonChrome.cs
- ListViewItemMouseHoverEvent.cs
- IdentityManager.cs
- TypeResolvingOptionsAttribute.cs
- EntityProxyFactory.cs
- DESCryptoServiceProvider.cs
- ModifierKeysValueSerializer.cs
- RotateTransform.cs
- odbcmetadatacollectionnames.cs
- SafeEventLogWriteHandle.cs
- PseudoWebRequest.cs
- ImpersonateTokenRef.cs
- DataBinder.cs
- AppDomainShutdownMonitor.cs
- ServiceHostFactory.cs
- XmlWellformedWriter.cs
- SendMailErrorEventArgs.cs
- CipherData.cs
- IdentityHolder.cs
- parserscommon.cs
- Point4DConverter.cs
- brushes.cs
- FormClosingEvent.cs
- TypeSystem.cs
- AuthenticationModuleElementCollection.cs
- ClientBuildManager.cs
- ApplicationFileParser.cs
- SecurityHeader.cs
- OdbcFactory.cs
- DataGridDetailsPresenterAutomationPeer.cs
- PrePrepareMethodAttribute.cs
- ContentDisposition.cs
- ProfileManager.cs
- TraceData.cs
- ScanQueryOperator.cs
- SimpleRecyclingCache.cs
- tabpagecollectioneditor.cs
- TypeDelegator.cs
- ValidationHelpers.cs
- RSAPKCS1SignatureFormatter.cs
- BindStream.cs
- SqlTopReducer.cs
- XmlNamespaceManager.cs
- TrustManagerMoreInformation.cs
- DecimalAnimationUsingKeyFrames.cs
- ObjectDataSourceFilteringEventArgs.cs
- ReadOnlyAttribute.cs