Fermer

avril 17, 2019

le successeur naturel des formulaires Web


ASP.NET Core Razor Pages est le successeur naturel du cadre de développement Web Forms traditionnel. Mike Brind essaie de démontrer cela avec une orientation de haut niveau des fonctionnalités comparables, montrant comment les cartes s'interconnectent.

Web Forms Dead?

Eh bien, oui et non. Les formulaires Web ASP.NET ne sont pas complètement morts, mais ils ont pratiquement fait leur temps. De nombreuses applications Web Forms existantes sont toujours prises en charge, maintenues et développées, et de nombreux développeurs travaillent encore avec Web Forms. Mais le développement Web évolue. Les cadres doivent être agiles et légers. Ils doivent évoluer rapidement. Et ils doivent prendre en charge un large choix de plates-formes. Ils doivent également inclure le couplage faible en tant que fonctionnalité.

Web Forms n'a jamais été conçu pour prendre en charge une approche faiblement couplée du développement Web. Le framework a été principalement conçu pour imiter autant que possible l'expérience de développement de postes de travail. Toute l'interface utilisateur de chaque page est encapsulée dans un élément

que cela soit nécessaire ou non. Cet outil favorise une expérience de conception par glisser-déposer, au détriment de la connaissance des technologies sous-jacentes sur lesquelles le Web est construit – HTTP, HTML, CSS. L'injection de dépendance, une technique qui sous-tend le couplage lâche, était difficile à mettre en œuvre. Les points d'extensibilité sont rares. Vous ne pouvez pas facilement remplacer le système de génération HTML par défaut par quelque chose de votre choix.

Au fil des années, des améliorations ont été apportées au cadre Web Forms qui tente efficacement de réduire ses couches d’abstraction. Vous avez plus de contrôle sur la sortie générée par les contrôles serveur et sur l'utilisation de l'état d'affichage. Des fonctionnalités telles que la liaison de modèle ont été transplantées à partir du framework MVC introduit plus récemment. Et dans la dernière mise à jour, la prise en charge de l'injection de dépendance a été introduite.

Mais la dernière mise à jour de Web Forms remonte à il y a près d'un an. Il ne fonctionne toujours qu'avec le serveur Web Internet Information Services sous Windows et nécessite l'installation de la totalité du .NET Framework. Les développeurs débutant dans ASP.NET n'apprennent pas les formulaires Web.

Pendant les années, la seule alternative aux développeurs Web pour les développeurs ASP.NET existants était le modèle MVC ( -View-Controller ). L’un des plus gros problèmes avec MVC est l’architecture elle-même. Le développement basé sur le contrôleur de page est assez facile à comprendre. Chaque page a son propre contrôleur, qui peut être la page elle-même, ou dans un objet correspondant séparé tel qu'un «code-behind».

MVC ajoute ce que certains diraient une complexité inutile du processus de développement. Il n'y a plus de mappage univoque entre les URL et les fichiers sur le disque. Si vous voulez faire quelque chose, vous devez ajouter des fichiers à plusieurs endroits différents. Vous devez comprendre l'interaction entre les différentes parties de l'architecture. Par rapport aux modèles de développement centrés sur la page, MVC ajoute beaucoup de cérémonie à la création d’un site Web.

Le cadre de pages Web ASP.NET a été introduit en 2010 dans le cadre de la «pile WebMatrix», en partie pour réduire le nombre de concepts associé à MVC. Bien que Web Pages fournisse un retour au développement basé sur le contrôleur de page, ce n’est pas sans problèmes. Il a été principalement conçu pour faciliter les débutants au développement Web et pour aider les développeurs PHP existants à utiliser la pile Microsoft. En tant que tel, il ne fournissait rien au développeur professionnel cherchant à créer des applications Web robustes, testables et évolutives. Le modèle de développement a encouragé le mélange de la logique de traitement et du balisage HTML dans le même fichier, ce qui permet aux développeurs de réintroduire très facilement les problèmes associés au «code spaghetti» – des difficultés de test et de maintenance. Web Pages a également beaucoup utilisé le type dynamic (introduit dans .NET 4.0) dans le cadre de sa technologie d'accès aux données, qui est assez difficile à déboguer.

Les principaux piliers de la pile WebMatrix étaient obsolètes: l'EDI WebMatrix et le produit de base de données basé sur des fichiers, SQL Server Compact Edition, éliminant efficacement les pages Web en tant que modèle de développement autonome. Mais cela a laissé un héritage – la syntaxe de modèle Razor sur laquelle Web Pages a été construite. Et les fondements de la structure de pages Web existent toujours aujourd'hui, à savoir le moteur de vue de pages Web, qui supplantait le moteur de vue de formulaires Web à partir de MVC 3.0

.NET Core

Puis, a été lancé par .NET Core en 2016, un cadre plus léger conçu pour ne pas dépendre de Windows, afin de pouvoir fonctionner sur d'autres plates-formes. .NET Core est également conçu pour résoudre d’autres problèmes. Sa conception est modulaire, ce qui permet au développeur de choisir les composants dont il a besoin, plutôt que de supporter les frais généraux de tout le monde. Il a été conçu pour supporter beaucoup plus d'extensibilité. L'injection de dépendance est une fonctionnalité de premier ordre, supportant un couplage lâche. Et ses performances sont bien meilleures que celles d’ASP.NET traditionnel.

Lors de son lancement, .NET Core n’offrait que le modèle MVC aux développeurs Web. La version 2.0 d'ASP.NET Core incluait un nouveau modèle de développement centré sur la page appelé Razor Pages. Ce paradigme utilise la syntaxe de modèle Razor (facile à apprendre) et se situe également au-dessus du cadre MVC. Mais vous n’avez besoin de rien savoir de MVC pour travailler avec Razor Pages. Razor Pages est le successeur naturel de Web Forms.

Mappage des fonctionnalités de Web Forms dans le modèle Razor Pages

Le reste de cet article explore les principales fonctionnalités du modèle de développement Web Forms et décrit comment elles sont mappées. au modèle Razor Pages. Je vais décrire les caractéristiques de chacune des fonctionnalités, sans nécessairement aller trop loin dans les détails techniques. Le code est inclus lorsqu'il est utile d'illustrer la forme de base de la fonctionnalité en cours de discussion.

Traitement de la demande: code derrière

Le contrôleur de chaque formulaire Web est son fichier code-behind une classe distincte. fichier qui correspond à un modèle – le fichier .aspx . Le fichier de classe provient de System.Web.UI.Page . La logique générale de traitement de la demande est généralement placée dans la méthode Page_Load . Le verbe utilisé pour faire une demande est déterminé en examinant la propriété IsPostBack de la page:

 public class Index: Page
{
  Void Page_Load protégé (expéditeur d'objet, EventArgs e)
  {
    si (IsPostBack)
    {
      // traite la demande POST
    }
    autre
    {
      // traite la demande GET
    }
  }
} 

L’équivalent de code-behind dans Razor Pages est la classe PageModel qui présente une correspondance individuelle avec sa page de contenu (analogue à la .aspx ). La logique de traitement des demandes est placée dans les méthodes de gestionnaire . Ceux-ci sont nommés, par convention, d'après le verbe utilisé pour la demande qu'ils traitent: OnGet et OnPost (avec leurs équivalents asynchrones):

 public class IndexModel: PageModel
{
  liste publique  Produits {get; ensemble; } = nouvelle liste  ();
  chaîne publique Title {get; ensemble; }

  public vide OnGet ()
  {
    // traite la demande GET
  }

  vide public OnPost ()
  {
    // traite la demande POST
  }
}

Des propriétés publiques ad hoc peuvent être ajoutées à la classe PageModel représentant des éléments pouvant être utilisés dans la page de contenu.

Présentation: Génération d'interface utilisateur

Pages de contenu

Les pages "Rasoir" La page de contenu contient un mélange de HTML et de logique côté serveur, qui est incluse dans la page à l'aide de la syntaxe Razor. La logique côté serveur est généralement limitée à la sortie nécessaire au contrôle, telle que les boucles, les conditions, voire certaines chaînes de mise en forme.

Tout comme les formulaires Web, les pages de contenu Razor ont une directive page qui est requis et placé en haut du fichier. Vient ensuite une directive concernant le modèle qui spécifie le type de données avec lesquelles la page est censée fonctionner (le modèle ). Par défaut, il s'agit du type de données de la classe PageModel correspondante:

 @page
@model IndexModel
... 

Les propriétés publiques et les méthodes de la classe PageModel sont exposées sur la page de contenu via sa propriété Modèle :

 @page
@model IndexModel

@ Model.Title

    @if (Model.Products.Any ()) {   foreach (produit var dans Model.Products)   {     
  • @ product.ProductName
  •   } }

Pages maîtres

Le fichier de page maître de Web Forms est utilisé pour centraliser le contrôle de la présentation de toutes les pages qui l'implémentent. Il est généralement déclaré comme faisant partie de la directive Page dans le fichier modèle:

 <%@ Page Title="Home"
         Language="C#"
         AutoEventWireup="true"
         CodeBehind="Index.aspx.cs"
         Inherits="Index"
         MasterPageFile="~/Site.Master" %> 

L’équivalent de Razor au fichier de page maître est le fichier de présentation. Vous pouvez spécifier le fichier de présentation qu'une page Razor doit utiliser en définissant la propriété Layout de la page Razor sur le chemin relatif du fichier spécifié:

 @ {
  Layout = "/shared/_Layout.cshtml";
}

Razor offre une commodité supplémentaire grâce à la forme du fichier ViewImports – un fichier qui affecte toutes les pages du dossier dans lequel il est placé, ainsi que celles de tous les sous-dossiers. Vous pouvez spécifier le fichier de présentation à utiliser par toutes ces pages dans le fichier ViewImports .

Dans une page maître Web Forms, l'emplacement du contenu de la page est défini en plaçant un ou plusieurs . ] Contrôles ContentPlaceHolder . Les contrôles de contenu correspondant aux espaces réservés sont renseignés avec le contenu du formulaire Web. Le modèle habituel consiste à fournir un espace réservé de contenu principal représentant le gros de la sortie du formulaire Web, ainsi que des espaces réservés auxiliaires pour les balises méta, les scripts, les feuilles de style, etc., propres à la page.

Une page de présentation Razor doit avoir un appel à la RenderBody qui est l'équivalent de l'espace réservé de contenu principal dans une page maître. Les espaces réservés auxiliaires sont représentés par des appels à la méthode RenderSection dans la présentation Razor. L'exemple suivant montre une page de mise en page Razor très simple illustrant les appels RenderBody et RenderSection :

 

  
    
     
    
  
  
    
      @RenderBody ()     
    @RenderSection ("scripts", false)   

Le contenu principal est rendu dans l'élément

et une section distincte est définie dans l'appel de méthode RenderSection . Dans cet exemple, le nom de la section est «scripts» et le deuxième paramètre de l'appel de méthode spécifie que la section est facultative. Il n'est pas nécessaire de le renseigner dans chaque page Razor utilisant cette page de présentation particulière.

Contrôles de serveur

Les contrôles de serveur sont exclusifs à Web Forms. Il n'y a pas d'équivalent direct lorsque vous travaillez avec des modèles basés sur Razor. Les choses les plus proches que Razor Pages propose sont Tag Helpers – des composants réutilisables pour l’automatisation de la génération de HTML. Un assistant de balise cible des balises HTML ou personnalisées spécifiques dans le modèle Razor. En ajoutant des attributs spéciaux, généralement précédés de asp- le code côté serveur est impliqué dans la génération du code HTML restitué.

Il existe par exemple des aides à la balise pour les entrées de formulaire. Ils sont principalement conçus pour faciliter la liaison bidirectionnelle des données. Il existe également des aides aux tags pour l'affichage des images et des hyperliens. L'exemple suivant d'assistant de balise anchor illustre certains des attributs les plus couramment utilisés pour générer un lien vers une page intitulée Edit en passant une valeur de route de 1:

  Edit  

Les contrôles de serveur lié aux données plus complexes, tels que les GridView et DataList ne disposent pas d’aides au tag équivalentes dans ASP.NET Core, mais il existe des contrôles commerciaux disponibles (y compris certains des propriétaires de ce blog ). Toutefois, il existe un équivalent du contrôle DropDownList – l'aide à la balise select.

L'exemple suivant lie la valeur sélectionnée à la propriété ProductId de la PageModel ]et spécifie que les options doivent être générées à partir des éléments de la propriété ProductOptions qui sera soit un exemple de SelectList soit une collection de SelectListItem :

 

Contrôles utilisateur

Les contrôles utilisateur dans les formulaires Web représentent des fragments réutilisables de HTML qui peuvent ou non nécessiter un traitement quelconque du côté serveur. L'équivalent Razor Page le plus proche du contrôle utilisateur est un composant View. Comme un contrôle utilisateur, un composant de vue est constitué de deux parties: un fichier modèle et un fichier (ou contrôleur) «code derrière» dérivé de la classe ViewComponent et implémentant une méthode appelée InvokeAsync .

Le fichier de modèle comporte une directive @model qui dicte le type de données des données avec lesquelles le modèle doit fonctionner:

 @model List 

@foreach (produit var dans le modèle) {
@ product.ProductName
...

La méthode InvokeAsync de la classe de contrôleur est utilisée pour préparer les données et les transmettre au modèle:

 tâche publique asynchrone  InvokeAsync ()
{
  Liste  produits = wait productService.GetProductsAsync ();
  retourner Voir (produits);
}

Liaison de modèle

La liaison de modèle Web Forms consiste à associer un type d'entité à un contrôle databound. Le framework tente d’extraire les valeurs des entrées du contrôle, puis de construire une instance de l’entité spécifiée à partir des valeurs soumises:

 
  
    
      
                   
                  
  

Dans Razor Pages, l'objet pouvant être lié est ajouté en tant que propriété publique à PageModel puis décoré de l'attribut BindProperty :

classe publique IndexModel: PageModel.
{
  [BindProperty]
  public Student Student {get; ensemble; }

  public IActionResult OnPost ()
  {
    if (ModelState.IsValid)
    {
      // enregistrer dans la base de données
    }
  }
}

Les aides de balise basées sur un formulaire permettent de lier les valeurs de propriété de l'entité dans les deux sens de la page de contenu:

 
  
   
     
     

Lorsque le formulaire est posté, le système de liaison modèle prend en charge la construction d'un exemple Student à partir des valeurs de formulaire soumises.

Résumé

Razor Pages est le successeur naturel de Web Forms. Il continue une longue ligne de cadres de développement Web centrés sur la page. En fait, avec l’introduction de Razor Pages, MVC n’est plus «roi». Le projet d’application Web par défaut dans Visual Studio s'appelle Razor Pages et le framework Razor Pages est l’approche recommandée par Microsoft pour la génération HTML côté serveur. Comme le montre cette orientation de haut niveau, passer de Web Forms à Razor Pages ne devrait pas être une expérience intimidante.


Pour plus d'informations sur la création d'excellentes applications avec ASP.NET Core

Vous souhaitez en savoir plus sur la création d'excellentes applications Web avec ASP.NET Core? N'oubliez pas de consulter Telerik UI for ASP.NET Core la bibliothèque de composants d'interface utilisateur complète qui vous permet de créer rapidement des applications réactives de haute qualité. Il comprend tout ce dont vous avez besoin, des grilles et graphiques aux menus déroulants et jauges.

En savoir plus sur l'interface utilisateur Telerik pour ASP.NET Core

Testez gratuitement l'interface utilisateur Telerik pour ASP. NET Core


Les commentaires sont désactivés en mode aperçu.




Source link