Idées de classe ASP.net “BasePage”

Quelles fonctionnalités et méthodes utiles ajoutez- vous à vos classes BasePage : System.Web.UI.Page ?

Exemples

Voici quelque chose que j’utilise pour l’authentification, et j’aimerais connaître votre opinion à ce sujet:

 protected override void OnPreInit(EventArgs e) { base.OnPreInit(e); // Authentication code omitted... Essentially same as below. if (_RequiresAuthentication && !(IsAuthorized)) { RespondForbidden("You do not have permissions to view this page.", UnauthorizedRedirect); return; } } // This function is overridden in each page subclass and fitted to each page's // own authorization requirements. // This also allows cascading authorization checks, // eg: User has permission to view page? No - base.IsAuthorized - Is user an admin? protected virtual bool IsAuthorized { get { return true; } } 

Ma classe BasePage contient une instance de cette classe:

 public class StatusCodeResponse { public StatusCodeResponse(HttpContext context) { this._context = context; } ///  /// Responds with a specified status code, and if specified - transfers to a page. ///  private void RespondStatusCode(HttpContext context, System.Net.HttpStatusCode status, ssortingng message, ssortingng transfer) { if (ssortingng.IsNullOrEmpty(transfer)) { throw new HttpException((int)status, message); } context.Response.StatusCode = (int)status; context.Response.StatusDescription = message; context.Server.Transfer(transfer); } public void RespondForbidden(ssortingng message, ssortingng transfer) { RespondStatusCode(this._context, System.Net.HttpStatusCode.Forbidden, message, transfer); } // And a few more like these... } 

En guise de remarque, cela pourrait être réalisé à l’aide de méthodes d’extension pour l’object HttpResponse .

Et une autre méthode que je trouve assez pratique pour parsingr les arguments int de chaîne de requête:

 public bool ParseId(ssortingng field, out int result) { return (int.TryParse(Request.QuerySsortingng[field], out result) && result > 0); } 

  • Des objects liés à la session, certains objects complexes de la page de base mappés sur une session et exposés sous forme de propriété.
  • Faire des choses comme remplir un object de tampon de crumble.

Mais le plus important: ne faites pas de votre page de base une classe d’aide . ParseId() pas de choses comme ParseId() , c’est ridicule.


En outre, basé sur le premier message: créez des éléments tels que le résumé IsAuthorized . Ainsi, vous ne créez pas de failles de sécurité gigantesques si quelqu’un oublie qu’il existe une méthode virtuelle.

 using System; using System.Collections.Generic; using System.Text.RegularExpressions; using System.Web; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; namespace MySite { ///  /// Base class with properties for meta tags for content pages /// http://www.codeproject.com/KB/aspnet/PageTags.aspx /// http://weblogs.asp.net/scottgu/archive/2005/08/02/421405.aspx ///  public partial class BasePage : System.Web.UI.Page { private ssortingng keywords; private ssortingng description; ///  /// Gets or sets the Meta Keywords tag for the page ///  public ssortingng Meta_Keywords { get { return keywords; } set { // Ssortingp out any excessive white-space, newlines and linefeeds keywords = Regex.Replace(value, "\\s+", " "); } } ///  /// Gets or sets the Meta Description tag for the page ///  public ssortingng Meta_Description { get { return description; } set { // Ssortingp out any excessive white-space, newlines and linefeeds description = Regex.Replace(value, "\\s+", " "); } } // Constructor // Add an event handler to Init event for the control // so we can execute code when a server control (page) // that inherits from this base class is initialized. public BasePage() { Init += new EventHandler(BasePage_Init); } // Whenever a page that uses this base class is initialized, // add meta keywords and descriptions if available void BasePage_Init(object sender, EventArgs e) { if (!Ssortingng.IsNullOrEmpty(Meta_Keywords)) { HtmlMeta tag = new HtmlMeta(); tag.Name = "keywords"; tag.Content = Meta_Keywords; Header.Controls.Add(tag); } if (!Ssortingng.IsNullOrEmpty(Meta_Description)) { HtmlMeta tag = new HtmlMeta(); tag.Name = "description"; tag.Content = Meta_Description; Header.Controls.Add(tag); } } } } 

En plus des métadonnées déjà mentionnées (la plupart du temps obsolètes dans ASP.NET 4.0 avec les nouvelles propriétés Page.MetaDescription et Page.MetaKeywords ), j’ai également eu des méthodes pour append d’autres liens d’en-tête à ma page, tels que ceux permettant d’append des CSS spécifiques à une page. , ou des choses comme des liens canoniques, des liens RSS, etc.:

 ///  /// Adds a CSS link to the page. Useful when you don't have access to the /// HeadContent ContentPlaceHolder. This method has 4 overloads. ///  ///  /// Adds a CSS link. ///  /// The path to CSS file. public void AddCss(ssortingng pathToCss) { AddCss(pathToCss, ssortingng.Empty); } ///  /// Adds a CSS link in a specific position. ///  /// The path to CSS. /// The postion. public void AddCss(ssortingng pathToCss, int? position) { AddCss(pathToCss, ssortingng.Empty, position); } ///  /// Adds a CSS link to the page with a specific media type. ///  /// The path to CSS file. /// The media type this stylesheet relates to. public void AddCss(ssortingng pathToCss, ssortingng media) { AddHeaderLink(pathToCss, "text/css", "Stylesheet", media, null); } ///  /// Adds a CSS link to the page with a specific media type in a specific /// position. ///  /// The path to CSS. /// The media. /// The postion. public void AddCss(ssortingng pathToCss, ssortingng media, int? position) { AddHeaderLink(pathToCss, "text/css", "Stylesheet", media, position); } ///  /// Adds a general header link. Useful when you don't have access to the /// HeadContent ContentPlaceHolder. This method has 3 overloads. ///  ///  /// Adds a general header link. ///  /// The path to the resource. /// The type of the resource. public void AddHeaderLink(ssortingng href, ssortingng type) { AddHeaderLink(href, type, ssortingng.Empty, ssortingng.Empty, null); } ///  /// Adds a general header link. ///  /// The path to the resource. /// The type of the resource. /// The relation of the resource to the page. public void AddHeaderLink(ssortingng href, ssortingng type, ssortingng rel) { AddHeaderLink(href, type, rel, ssortingng.Empty, null); } ///  /// Adds a general header link. ///  /// The path to the resource. /// The type of the resource. /// The relation of the resource to the page. /// The media target of the link. public void AddHeaderLink(ssortingng href, ssortingng type, ssortingng rel, ssortingng media) { AddHeaderLink(href, type, rel, media, null); } ///  /// Adds a general header link. ///  /// The path to the resource. /// The type of the resource. /// The relation of the resource to the page. /// The media target of the link. /// The postion in the control order - leave as null /// to append to the end. public void AddHeaderLink(ssortingng href, ssortingng type, ssortingng rel, ssortingng media, int? position) { var link = new HtmlLink { Href = href }; if (0 != type.Length) { link.Atsortingbutes.Add(HtmlTextWriterAtsortingbute.Type.ToSsortingng().ToLower(), type); } if (0 != rel.Length) { link.Atsortingbutes.Add(HtmlTextWriterAtsortingbute.Rel.ToSsortingng().ToLower(), rel); } if (0 != media.Length) { link.Atsortingbutes.Add("media", media); } if (null == position || -1 == position) { Page.Header.Controls.Add(link); } else { Page.Header.Controls.AddAt((int)position, link); } } 

Initialisation de la culture en surchargeant la méthode InitializeCulture() (set culture et ui culture à partir de cookie ou de firebase database).

Certaines de mes applications sont personnalisables, puis ici, je fais aussi des “démarches de marque”.

J’utilise ce méthot et merci pour le vôtre,

 ///  /// Displays the alert. ///  /// The message to display. protected virtual void DisplayAlert(ssortingng message) { ClientScript.RegisterStartupScript( GetType(), Guid.NewGuid().ToSsortingng(), ssortingng.Format("alert('{0}');", message.Replace("'", @"\'")), true ); } ///  /// Finds the control recursive. ///  /// The id. /// control protected virtual Control FindControlRecursive(ssortingng id) { return FindControlRecursive(id, this); } ///  /// Finds the control recursive. ///  /// The id. /// The parent. /// control protected virtual Control FindControlRecursive(ssortingng id, Control parent) { if (ssortingng.Compare(parent.ID, id, true) == 0) return parent; foreach (Control child in parent.Controls) { Control match = FindControlRecursive(id, child); if (match != null) return match; } return null; } 

Mettre du code d’autorisation dans une page de base n’est généralement pas une bonne idée. Le problème est que se passe-t-il si vous oubliez de dériver une page nécessitant une autorisation de la page de base? Vous aurez un trou de sécurité.

Il vaut bien mieux utiliser un HttpModule pour pouvoir intercepter les demandes de toutes les pages et s’assurer que les utilisateurs sont autorisés avant que le HttpHandler ait une chance de s’exécuter.

En outre, comme d’autres l’ont dit, et conformément aux principes de OO, il est préférable d’avoir uniquement des méthodes sur votre page de base qui se rapportent réellement à la page elle-même. S’ils ne font pas référence à “this”, ils devraient probablement être dans une classe d’aide – ou peut-être être des méthodes d’extension.

J’hérite de System.Web.UI.Page lorsque j’ai besoin de certaines propriétés et de chaque page. C’est bon pour une application Web qui implémente un login. Dans les pages d’adhésion, j’utilise ma propre classe de base pour accéder aux propriétés telles que UserID, UserName, etc. Ces propriétés encapsulent des variables de session.

Voici quelques exemples (sans code) pour lesquels j’utilise une classe de base personnalisée:

  1. Ajouter un filtre de page (par exemple, remplacer “{thème}” par “~ / App_Theme / [currentTheme]”),
  2. Ajouter une propriété et gérer les pages de titrage automatique en fonction de la carte du site,
  3. Enregistrement de la journalisation spécialisée (pourrait probablement être refait de différentes manières),
  4. Ajout de méthodes pour la validation d’entrée généralisée (Form / Queryssortingng), avec redirecteur général: AddRequiredInput (“WidgetID”, PageInputType.QuerySsortingng, typeof (ssortingng)),
  5. Aide de la carte du site, permettant par exemple de changer une “classe d’édition” statique en un contexte lié comme “éditer Science ‘de l’automne 2010”
  6. ViewState Helpers, me permettant d’enregistrer une variable sur la page sous un nom et de la laisser renseigner automatiquement cette variable à partir du viewstate ou d’un paramètre par défaut, puis d’enregistrer la valeur dans le viewstate à la fin de la demande.
  7. Redirecteur personnalisé 404, dans lequel je peux transmettre une exception ou un message (ou les deux) et accéder à une page que j’ai prédéfinie pour bien l’afficher et la consigner.

Personnellement, j’aime beaucoup le # 5 parce que a) la mise à jour de la carte du site est laide et que je préfère ne pas encombrer la page, ce qui la rend plus lisible. B) Elle rend la carte du site beaucoup plus conviviale.

,

Veuillez vous reporter à Obtenir des informations spécifiques à une page dans la page ASP.Net Base.

 public abstract ssortingng AppSettingsRolesName { get; } List authorizedRoles = new List((ConfigurationManager.AppSettings[AppSettingsRolesName]).Split(',')) if (!authorizedRoles.Contains(userRole)) { Response.Redirect("UnauthorizedPage.aspx"); } 

En page dérivée

 public override ssortingng AppSettingsRolesName { get { return "LogsScreenRoles"; } }