100% found this document useful (1 vote)
18 views

Instant Download Building Web Applications with .NET Core 2.1 and JavaScript: Leveraging Modern JavaScript Frameworks - Second Edition Philip Japikse PDF All Chapters

Leveraging

Uploaded by

choatbalhaj
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
18 views

Instant Download Building Web Applications with .NET Core 2.1 and JavaScript: Leveraging Modern JavaScript Frameworks - Second Edition Philip Japikse PDF All Chapters

Leveraging

Uploaded by

choatbalhaj
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 65

Download Full Version ebook - Visit ebookmeta.

com

Building Web Applications with .NET Core 2.1 and


JavaScript: Leveraging Modern JavaScript
Frameworks - Second Edition Philip Japikse

https://ebookmeta.com/product/building-web-applications-
with-net-core-2-1-and-javascript-leveraging-modern-
javascript-frameworks-second-edition-philip-japikse/

OR CLICK HERE

DOWLOAD NOW

Discover More Ebook - Explore Now at ebookmeta.com


Instant digital products (PDF, ePub, MOBI) ready for you
Download now and discover formats that fit your needs...

Start reading on any device today!

Building Web Applications with Visual Studio 2017: Using


.NET Core and Modern JavaScript Frameworks 1st Edition
Philip Japikse
https://ebookmeta.com/product/building-web-applications-with-visual-
studio-2017-using-net-core-and-modern-javascript-frameworks-1st-
edition-philip-japikse/
ebookmeta.com

JavaScript Frameworks for Modern Web Development, 2nd


Edition Sufyan Bin Uzayr

https://ebookmeta.com/product/javascript-frameworks-for-modern-web-
development-2nd-edition-sufyan-bin-uzayr/

ebookmeta.com

JavaScript Frameworks for Modern Web Dev 1st Edition Tim


Ambler Nicholas Cloud

https://ebookmeta.com/product/javascript-frameworks-for-modern-web-
dev-1st-edition-tim-ambler-nicholas-cloud/

ebookmeta.com

Museum of the Profane 01 0 Disabling Relics for Dummies


1st Edition J B Trepagnier

https://ebookmeta.com/product/museum-of-the-profane-01-0-disabling-
relics-for-dummies-1st-edition-j-b-trepagnier/

ebookmeta.com
Peridale Cafe Cozy Mystery Box Set 4 Books 13 16 Agatha
Frost

https://ebookmeta.com/product/peridale-cafe-cozy-mystery-box-
set-4-books-13-16-agatha-frost/

ebookmeta.com

Basic Real Estate and Property Law for Paralegals, 7th


Edition Jeffrey A. Helewitz

https://ebookmeta.com/product/basic-real-estate-and-property-law-for-
paralegals-7th-edition-jeffrey-a-helewitz/

ebookmeta.com

The Art of Body Talk How to Decode Gestures Mannerisms and


Other Non Verbal Messages Gregory Hartley Maryann Karinch

https://ebookmeta.com/product/the-art-of-body-talk-how-to-decode-
gestures-mannerisms-and-other-non-verbal-messages-gregory-hartley-
maryann-karinch/
ebookmeta.com

Don t Judge A Duke By His Cover Emily E K Murdoch

https://ebookmeta.com/product/don-t-judge-a-duke-by-his-cover-emily-e-
k-murdoch/

ebookmeta.com

Teaching Global History A Social Studies Approach 2nd


Edition Alan J Singer

https://ebookmeta.com/product/teaching-global-history-a-social-
studies-approach-2nd-edition-alan-j-singer/

ebookmeta.com
Private Selves Legal Personhood In European Privacy
Protection 1st Edition Susanna Lindroos-Hovinheimo

https://ebookmeta.com/product/private-selves-legal-personhood-in-
european-privacy-protection-1st-edition-susanna-lindroos-hovinheimo/

ebookmeta.com
Building Web Applications
with .NET Core 2.1 and
JavaScript
Leveraging Modern JavaScript Frameworks

Second Edition

Philip Japikse
Kevin Grossnicklaus
Ben Dewey
Building Web Applications
with .NET Core 2.1 and
JavaScript
Leveraging Modern JavaScript
Frameworks
Second Edition

Philip Japikse
Kevin Grossnicklaus
Ben Dewey
Building Web Applications with .NET Core 2.1 and JavaScript: Leveraging Modern
JavaScript Frameworks
Philip Japikse Kevin Grossnicklaus
West Chester, OH, USA Ellisville, MO, USA
Ben Dewey
Charleston, SC, USA

ISBN-13 (pbk): 978-1-4842-5351-9 ISBN-13 (electronic): 978-1-4842-5352-6


https://doi.org/10.1007/978-1-4842-5352-6

Copyright © 2020 by Philip Japikse, Kevin Grossnicklaus, Ben Dewey


This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the
material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation,
broadcasting, reproduction on microfilms or in any other physical way, and transmission or information
storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now
known or hereafter developed.
Trademarked names, logos, and images may appear in this book. Rather than use a trademark symbol with
every occurrence of a trademarked name, logo, or image we use the names, logos, and images only in an
editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the
trademark.
The use in this publication of trade names, trademarks, service marks, and similar terms, even if they are not
identified as such, is not to be taken as an expression of opinion as to whether or not they are subject to
proprietary rights.
While the advice and information in this book are believed to be true and accurate at the date of publication,
neither the authors nor the editors nor the publisher can accept any legal responsibility for any errors or
omissions that may be made. The publisher makes no warranty, express or implied, with respect to the
material contained herein.
Managing Director, Apress Media LLC: Welmoed Spahr
Acquisitions Editor: Joan Murray
Development Editor: Laura Berendson
Coordinating Editor: Jill Balzano
Cover image designed by Freepik (www.freepik.com)
Distributed to the book trade worldwide by Springer Science+Business Media New York, 233 Spring Street,
6th Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax (201) 348-4505, e-mail orders-ny@springer-
sbm.com, or visit www.springeronline.com. Apress Media, LLC is a California LLC and the sole member
(owner) is Springer Science + Business Media Finance Inc (SSBM Finance Inc). SSBM Finance Inc is a
Delaware corporation.
For information on translations, please e-mail rights@apress.com, or visit http://www.apress.com/
rights-permissions.
Apress titles may be purchased in bulk for academic, corporate, or promotional use. eBook versions and
licenses are also available for most titles. For more information, reference our Print and eBook Bulk Sales
web page at http://www.apress.com/bulk-sales.
Any source code or other supplementary material referenced by the author in this book is available to
readers on GitHub via the book’s product page, located at www.apress.com/9781484253519. For more
detailed information, please visit http://www.apress.com/source-code.
Printed on acid-free paper
To Amy, Coner, Logan, and Skylar. Without your
support and patience, this work would never
have happened. Love you guys.

—Philip Japikse
Table of Contents
About the Authors���������������������������������������������������������������������������������������������������xix

About the Technical Reviewer��������������������������������������������������������������������������������xxi


Acknowledgments������������������������������������������������������������������������������������������������xxiii

Introduction�����������������������������������������������������������������������������������������������������������xxv

Part I: .NET Core 2.1���������������������������������������������������������������������������������������� 1


Chapter 1: Introducing .NET Core����������������������������������������������������������������������������� 3
From Project K to .NET Core���������������������������������������������������������������������������������������������������������� 3
The Goals of .NET Core������������������������������������������������������������������������������������������������������������������ 4
Cross-Platform Support����������������������������������������������������������������������������������������������������������� 5
Performance���������������������������������������������������������������������������������������������������������������������������� 7
Portable Class Libraries with .NET Standard��������������������������������������������������������������������������� 7
Portable or Stand-Alone Deployment Models�������������������������������������������������������������������������� 7
Full Command Line Support���������������������������������������������������������������������������������������������������� 8
Open Source���������������������������������������������������������������������������������������������������������������������������� 8
Interoperability with the .NET Framework������������������������������������������������������������������������������� 8
The Composition of .NET Core������������������������������������������������������������������������������������������������������ 9
The .NET Core Runtime (CoreCLR)������������������������������������������������������������������������������������������� 9
The Framework Libraries (CoreFX)������������������������������������������������������������������������������������������ 9
The SDK Tools and the dotnet App Host�������������������������������������������������������������������������������� 10
The Language Compilers������������������������������������������������������������������������������������������������������� 10
The .NET Core Support Lifecycle������������������������������������������������������������������������������������������������� 10
The .NET Core SDK Versioning Scheme��������������������������������������������������������������������������������� 12
Installing .NET Core 2.1��������������������������������������������������������������������������������������������������������������� 13

v
Table of Contents

.NET Core and NuGet������������������������������������������������������������������������������������������������������������������� 14


Add/Remove NuGet Packages����������������������������������������������������������������������������������������������� 14
Restore NuGet Packages������������������������������������������������������������������������������������������������������� 15
Publishing .NET Core Applications����������������������������������������������������������������������������������������� 15
Installing the Developer Tools����������������������������������������������������������������������������������������������������� 16
Installing Visual Studio 2017������������������������������������������������������������������������������������������������� 16
Installing Visual Studio 2019������������������������������������������������������������������������������������������������� 17
Installing Visual Studio Code������������������������������������������������������������������������������������������������� 17
Create the Solution and Projects������������������������������������������������������������������������������������������������ 17
Create Solution and Projects with the CLI����������������������������������������������������������������������������� 17
Create the Solution and Projects Using Visual Studio����������������������������������������������������������� 22
Create the Solution and Projects Using Visual Studio Code�������������������������������������������������� 32
Set the C# Version to Latest�������������������������������������������������������������������������������������������������������� 32
Using the Project Properties GUI������������������������������������������������������������������������������������������� 32
Editing the Project File Directly��������������������������������������������������������������������������������������������� 33
Summary������������������������������������������������������������������������������������������������������������������������������������ 34

Chapter 2: Introducing Entity Framework Core������������������������������������������������������ 35


Object Relational Mappers���������������������������������������������������������������������������������������������������������� 35
The Components of Entity Framework Core������������������������������������������������������������������������������� 37
The DbContext/DbContextOptions����������������������������������������������������������������������������������������� 38
The ChangeTracker���������������������������������������������������������������������������������������������������������������� 39
The DbSet<T> and DbQuery<T> Collection Types���������������������������������������������������������������� 40
Entities����������������������������������������������������������������������������������������������������������������������������������� 41
Database Providers��������������������������������������������������������������������������������������������������������������� 45
Query Execution�������������������������������������������������������������������������������������������������������������������������� 45
Mixed Client-Server Evaluation��������������������������������������������������������������������������������������������� 46
Tracking vs. NoTracking Queries������������������������������������������������������������������������������������������� 46

vi
Table of Contents

Notable EF Core Features����������������������������������������������������������������������������������������������������������� 46


Transaction Support (1.0)������������������������������������������������������������������������������������������������������ 47
Concurrency Checking (1.0)�������������������������������������������������������������������������������������������������� 47
Connection Resiliency (1.1)��������������������������������������������������������������������������������������������������� 48
Eager Loading (1.0)��������������������������������������������������������������������������������������������������������������� 48
Explicit Loading (1.1)������������������������������������������������������������������������������������������������������������� 49
Global Query Filters (2.0)������������������������������������������������������������������������������������������������������� 49
Raw SQL Queries with LINQ (1.0)������������������������������������������������������������������������������������������ 50
Batching of Statements (1.0)������������������������������������������������������������������������������������������������� 50
Owned Object Types (2.1)������������������������������������������������������������������������������������������������������ 51
Attach New and Existing Entities (2.0)���������������������������������������������������������������������������������� 51
Database Function Mapping (2.0)������������������������������������������������������������������������������������������ 51
EF Core Migrations���������������������������������������������������������������������������������������������������������������������� 52
The EF Core CLI Commands�������������������������������������������������������������������������������������������������������� 53
The Database Commands������������������������������������������������������������������������������������������������������ 54
The DbContext Commands���������������������������������������������������������������������������������������������������� 54
The Migrations Command����������������������������������������������������������������������������������������������������� 55
Choose Your SQL Server Database Option���������������������������������������������������������������������������������� 55
LocalDb���������������������������������������������������������������������������������������������������������������������������������� 56
SQL Server Express, Developer, Standard, or Enterprise������������������������������������������������������� 57
Docker����������������������������������������������������������������������������������������������������������������������������������� 57
Add EF Core to the Data Access Layer���������������������������������������������������������������������������������������� 59
Add Packages Using the Command Line Interface���������������������������������������������������������������� 60
Add Packages Using NuGet Package Manager GUI��������������������������������������������������������������� 61
Install/Update Packages Using the Project File��������������������������������������������������������������������� 62
Summary������������������������������������������������������������������������������������������������������������������������������������ 63

vii
Table of Contents

Chapter 3: Build the Data Access Layer, Part 1������������������������������������������������������ 65


The SpyStore Database��������������������������������������������������������������������������������������������������������������� 66
Building the Context and Entity Classes������������������������������������������������������������������������������������� 66
The StoreContext Class��������������������������������������������������������������������������������������������������������� 67
The StoreContextFactory Class��������������������������������������������������������������������������������������������� 68
Build the SpyStore Entities���������������������������������������������������������������������������������������������������� 71
The Updated StoreContext Class������������������������������������������������������������������������������������������� 92
Create the First Migration����������������������������������������������������������������������������������������������������������� 94
Remove a Migration�������������������������������������������������������������������������������������������������������������� 97
Apply the Migration��������������������������������������������������������������������������������������������������������������������� 97
View the Database����������������������������������������������������������������������������������������������������������������� 98
Create the Migration SQL Scripts������������������������������������������������������������������������������������������ 98
Add SQL Server Objects with Migrations������������������������������������������������������������������������������������ 99
The Required SQL Server Objects����������������������������������������������������������������������������������������� 99
Add a New Blank Migration������������������������������������������������������������������������������������������������� 100
Create the Migration Helper������������������������������������������������������������������������������������������������ 100
Implement the TSQL Migration Up and Down Methods������������������������������������������������������� 105
Apply the Migration������������������������������������������������������������������������������������������������������������� 106
Add the Computed Columns����������������������������������������������������������������������������������������������������� 107
Update the OrderDetail Class���������������������������������������������������������������������������������������������� 107
Update the Order Class�������������������������������������������������������������������������������������������������������� 108
Update the Database����������������������������������������������������������������������������������������������������������� 109
Map SQL Server Functions to C#���������������������������������������������������������������������������������������������� 109
View Models������������������������������������������������������������������������������������������������������������������������������ 110
The Cart Record with Product Info View Model������������������������������������������������������������������� 110
The Cart with Customer Info View Model���������������������������������������������������������������������������� 112
The Order Detail with Product Info View Model������������������������������������������������������������������� 113
The Order with Details and Product Info View Model���������������������������������������������������������� 115
Summary���������������������������������������������������������������������������������������������������������������������������������� 118

viii
Table of Contents

Chapter 4: Complete the Data Access Layer��������������������������������������������������������� 119


CRUD Operations with EF Core�������������������������������������������������������������������������������������������������� 119
Create Records�������������������������������������������������������������������������������������������������������������������� 120
Read Records���������������������������������������������������������������������������������������������������������������������� 122
Update Records������������������������������������������������������������������������������������������������������������������� 129
Deleting Records����������������������������������������������������������������������������������������������������������������� 131
Create Custom Exceptions�������������������������������������������������������������������������������������������������������� 132
Create the General Exception���������������������������������������������������������������������������������������������� 132
Create the Specific Exceptions�������������������������������������������������������������������������������������������� 132
Add the Repositories����������������������������������������������������������������������������������������������������������������� 134
Add the Base Interface and Implementation����������������������������������������������������������������������� 135
Add the Entity Repo Interfaces�������������������������������������������������������������������������������������������� 143
Implement the Entity-Specific Repositories������������������������������������������������������������������������ 147
Automatic Database and Migration Handling��������������������������������������������������������������������������� 161
The Problem with the EnsureCreated Method��������������������������������������������������������������������� 161
Drop and Recreate the Database����������������������������������������������������������������������������������������� 161
Data Initialization���������������������������������������������������������������������������������������������������������������������� 162
Create Sample Data������������������������������������������������������������������������������������������������������������� 163
Load or Delete the Sample Data������������������������������������������������������������������������������������������ 167
Testing the Data Access Layer�������������������������������������������������������������������������������������������������� 170
Creating the CategoryTests Class���������������������������������������������������������������������������������������� 170
Testing EF CRUD Operations������������������������������������������������������������������������������������������������ 174
Summary���������������������������������������������������������������������������������������������������������������������������������� 180

Chapter 5: Introducing ASP.NET Core�������������������������������������������������������������������� 181


A Quick Look Back�������������������������������������������������������������������������������������������������������������������� 181
Introducing the MVC Pattern����������������������������������������������������������������������������������������������� 181
ASP.NET Core and the MVC Pattern������������������������������������������������������������������������������������� 182
ASP.NET Core and .NET Core����������������������������������������������������������������������������������������������������� 183
One Framework, Many Uses������������������������������������������������������������������������������������������������ 183

ix
Table of Contents

ASP.NET Core Features from MVC/WebAPI�������������������������������������������������������������������������������� 184


Convention over Configuration�������������������������������������������������������������������������������������������� 185
Controllers and Actions������������������������������������������������������������������������������������������������������� 186
Model Binding���������������������������������������������������������������������������������������������������������������������� 189
Model Validation������������������������������������������������������������������������������������������������������������������ 193
Routing�������������������������������������������������������������������������������������������������������������������������������� 194
Filters���������������������������������������������������������������������������������������������������������������������������������� 202
What’s New in ASP.NET Core����������������������������������������������������������������������������������������������������� 204
Built-In Dependency Injection��������������������������������������������������������������������������������������������� 205
Cloud-Ready Environment-Based Configuration System���������������������������������������������������� 206
Running on .NET Core or the Full .NET Framework������������������������������������������������������������� 209
Deploying ASP.NET Core Applications���������������������������������������������������������������������������������� 210
Lightweight and Modular HTTP Request Pipeline���������������������������������������������������������������� 210
Framework Based on Fine-Grained NuGet Packages���������������������������������������������������������� 210
Running ASP.NET Core Applications������������������������������������������������������������������������������������������ 211
Create and Configure the WebHost������������������������������������������������������������������������������������������� 213
The Program.cs File������������������������������������������������������������������������������������������������������������� 213
The Startup.cs File��������������������������������������������������������������������������������������������������������������� 217
Summary���������������������������������������������������������������������������������������������������������������������������������� 222

Chapter 6: Build the RESTful Service with ASP.NET Core�������������������������������������� 223


Introducing ASP.NET Core RESTful Services����������������������������������������������������������������������������� 223
Add the Additional NuGet Packages������������������������������������������������������������������������������������������ 224
The Startup.cs File�������������������������������������������������������������������������������������������������������������������� 224
Update the Constructor������������������������������������������������������������������������������������������������������� 225
Update the Configure Method���������������������������������������������������������������������������������������������� 225
The ConfigureServices Method������������������������������������������������������������������������������������������� 227
Run the Application������������������������������������������������������������������������������������������������������������������� 234

x
Table of Contents

Exception Filters����������������������������������������������������������������������������������������������������������������������� 235


Create the SpyStoreExceptionFilter������������������������������������������������������������������������������������� 236
Adding the Exception Filter for All Actions��������������������������������������������������������������������������� 239
Test the Exception Filter������������������������������������������������������������������������������������������������������ 239
The ApiController Attribute�������������������������������������������������������������������������������������������������������� 242
Attribute Routing Requirement�������������������������������������������������������������������������������������������� 242
Automatic 400 Responses��������������������������������������������������������������������������������������������������� 242
Binding Source Parameter Inference���������������������������������������������������������������������������������� 242
Controller Actions with RESTful Services���������������������������������������������������������������������������������� 243
Formatted Response Results����������������������������������������������������������������������������������������������� 244
Building the Controllers������������������������������������������������������������������������������������������������������������ 244
The Category Controller������������������������������������������������������������������������������������������������������� 245
The Customer Controller������������������������������������������������������������������������������������������������������ 247
The OrderDetails Controller������������������������������������������������������������������������������������������������� 248
The OrdersController����������������������������������������������������������������������������������������������������������� 249
The Product Controller��������������������������������������������������������������������������������������������������������� 250
The SearchController����������������������������������������������������������������������������������������������������������� 252
The ShoppingCartController������������������������������������������������������������������������������������������������ 253
The ShoppingCartRecordController������������������������������������������������������������������������������������� 255
Expand the Swagger Documentation���������������������������������������������������������������������������������������� 258
Docker Support and Orchestration�������������������������������������������������������������������������������������������� 261
Add Docker to the SpyStore.Service������������������������������������������������������������������������������������ 261
Add the Docker Compose Orchestration������������������������������������������������������������������������������ 262
Testing the Service������������������������������������������������������������������������������������������������������������������� 265
Create the BaseTestClass���������������������������������������������������������������������������������������������������� 265
Create the CustomerController Tests����������������������������������������������������������������������������������� 266
Summary���������������������������������������������������������������������������������������������������������������������������������� 269

xi
Table of Contents

Chapter 7: Build the Web Application with ASP.NET Core, Part 1������������������������� 271
Add the Additional NuGet Packages������������������������������������������������������������������������������������������ 271
ASP.NET Core Validation������������������������������������������������������������������������������������������������������������ 272
Custom Validation Attributes����������������������������������������������������������������������������������������������� 272
Format Client-Side Validation Errors����������������������������������������������������������������������������������� 281
Add the ViewModels������������������������������������������������������������������������������������������������������������������ 282
The AddToCartViewModel���������������������������������������������������������������������������������������������������� 282
The CartRecordViewModel�������������������������������������������������������������������������������������������������� 283
The CartViewModel������������������������������������������������������������������������������������������������������������� 283
The ProductViewModel�������������������������������������������������������������������������������������������������������� 284
Configure the Application���������������������������������������������������������������������������������������������������������� 284
The CustomerId������������������������������������������������������������������������������������������������������������������� 284
The ServiceSettings������������������������������������������������������������������������������������������������������������ 286
The API Service Wrapper����������������������������������������������������������������������������������������������������������� 290
The ISpyStoreServiceWrapper Interface������������������������������������������������������������������������������ 291
The SpyStoreServiceWrapper Class������������������������������������������������������������������������������������ 292
Add the SpyStoreServiceWrapper to the DI Container�������������������������������������������������������� 299
The Startup.cs File�������������������������������������������������������������������������������������������������������������������� 299
Update the Constructor������������������������������������������������������������������������������������������������������� 299
Remove the Routing Table Setup����������������������������������������������������������������������������������������� 300
Remove the Cookie Policy Options�������������������������������������������������������������������������������������� 300
Building the Controllers������������������������������������������������������������������������������������������������������������ 300
The Home Controller������������������������������������������������������������������������������������������������������������ 301
The ProductsController�������������������������������������������������������������������������������������������������������� 301
The Orders Controller���������������������������������������������������������������������������������������������������������� 306
The Cart Controller�������������������������������������������������������������������������������������������������������������� 308
Summary���������������������������������������������������������������������������������������������������������������������������������� 315

xii
Table of Contents

Chapter 8: Complete the Web Application with ASP.NET Core������������������������������ 317


Introducing the “V” in ASP.NET Core����������������������������������������������������������������������������������������� 317
ViewResults������������������������������������������������������������������������������������������������������������������������� 318
The Razor View Engine�������������������������������������������������������������������������������������������������������� 319
Views����������������������������������������������������������������������������������������������������������������������������������� 320
Layouts�������������������������������������������������������������������������������������������������������������������������������� 323
Partial Views������������������������������������������������������������������������������������������������������������������������ 324
Sending Data to Views��������������������������������������������������������������������������������������������������������� 324
Tag Helpers������������������������������������������������������������������������������������������������������������������������������� 325
Enabling Tag Helpers����������������������������������������������������������������������������������������������������������� 330
The Form Tag Helper����������������������������������������������������������������������������������������������������������� 330
The Anchor Tag Helper��������������������������������������������������������������������������������������������������������� 330
The Input Tag Helper������������������������������������������������������������������������������������������������������������ 331
The TextArea Tag Helper������������������������������������������������������������������������������������������������������ 332
The Select Tag Helper���������������������������������������������������������������������������������������������������������� 333
The Validation Tag Helpers�������������������������������������������������������������������������������������������������� 334
The Link and Script Tag Helpers������������������������������������������������������������������������������������������ 334
The Image Tag Helper���������������������������������������������������������������������������������������������������������� 335
The Environment Tag Helper������������������������������������������������������������������������������������������������ 336
Custom Tag Helpers������������������������������������������������������������������������������������������������������������� 337
View Components��������������������������������������������������������������������������������������������������������������������� 338
Build the Server-Side Code������������������������������������������������������������������������������������������������� 338
Build the Partial View���������������������������������������������������������������������������������������������������������� 341
Invoking View Components������������������������������������������������������������������������������������������������� 341
Invoking View Components As Custom Tag Helpers������������������������������������������������������������ 342
Managing Client-Side Libraries������������������������������������������������������������������������������������������������� 342
Install Library Manager������������������������������������������������������������������������������������������������������� 342
Add Client-Side Libraries to SpyStore.Mvc�������������������������������������������������������������������������� 343

xiii
Table of Contents

WebOptimizer���������������������������������������������������������������������������������������������������������������������������� 346
Bundling and Minification���������������������������������������������������������������������������������������������������� 346
The WebOptimizer Solution������������������������������������������������������������������������������������������������� 347
The Layout and Login Views����������������������������������������������������������������������������������������������������� 352
The Images and CSS for the Application����������������������������������������������������������������������������� 352
The Layout View������������������������������������������������������������������������������������������������������������������ 352
The LoginView Partial View������������������������������������������������������������������������������������������������� 355
The Products Views������������������������������������������������������������������������������������������������������������������� 356
The ProductList View����������������������������������������������������������������������������������������������������������� 357
The ProductViewModel DisplayTemplate���������������������������������������������������������������������������� 358
Running the SpyStore Application��������������������������������������������������������������������������������������������� 359
The Add to Cart Views��������������������������������������������������������������������������������������������������������������� 359
The Add to Cart View����������������������������������������������������������������������������������������������������������� 360
The AddToCartViewModel Editor Template�������������������������������������������������������������������������� 361
The Cart Views�������������������������������������������������������������������������������������������������������������������������� 363
The Index View�������������������������������������������������������������������������������������������������������������������� 363
The Update Partial View������������������������������������������������������������������������������������������������������ 367
The Cart Record View Model Editor Template���������������������������������������������������������������������� 368
The Orders and OrderDetails Views������������������������������������������������������������������������������������������ 369
The Index View�������������������������������������������������������������������������������������������������������������������� 370
The Details View������������������������������������������������������������������������������������������������������������������ 371
Summary���������������������������������������������������������������������������������������������������������������������������������� 374

Part II: Client-Side Tooling and JavaScript Frameworks���������������������������� 375


Chapter 9: JavaScript Application Tools��������������������������������������������������������������� 377
What Tools Are We Covering?���������������������������������������������������������������������������������������������������� 377
Node.js�������������������������������������������������������������������������������������������������������������������������������������� 378
Manually Installing Node.js�������������������������������������������������������������������������������������������������� 379
Installing Node Using the Chocolatey Package Manager���������������������������������������������������� 380
Setting Up Visual Studio to Use the Latest Version of Node������������������������������������������������ 380

xiv
Table of Contents

Getting Started with Node.js������������������������������������������������������������������������������������������������ 382


Introduction to NPM������������������������������������������������������������������������������������������������������������� 383
Saving Project Dependencies���������������������������������������������������������������������������������������������� 385
Executable Packages���������������������������������������������������������������������������������������������������������� 387
Installing Packages Locally vs. Globally������������������������������������������������������������������������������ 389
Gulp������������������������������������������������������������������������������������������������������������������������������������������� 390
Installing Gulp���������������������������������������������������������������������������������������������������������������������� 391
Copy Files Using Gulp���������������������������������������������������������������������������������������������������������� 392
Dependencies in Gulp���������������������������������������������������������������������������������������������������������� 394
Task Runner Explorer Within Visual Studio�������������������������������������������������������������������������� 397
Gulp Conclusion������������������������������������������������������������������������������������������������������������������� 398
Module Loaders and Bundlers�������������������������������������������������������������������������������������������������� 399
What Is a Module����������������������������������������������������������������������������������������������������������������� 399
Module Loaders and Bundlers��������������������������������������������������������������������������������������������� 402
SystemJS����������������������������������������������������������������������������������������������������������������������������� 402
WebPack������������������������������������������������������������������������������������������������������������������������������ 404
Parcel JS����������������������������������������������������������������������������������������������������������������������������� 410
Summary���������������������������������������������������������������������������������������������������������������������������������� 411

Chapter 10: Introduction to TypeScript����������������������������������������������������������������� 413


Why TypeScript?������������������������������������������������������������������������������������������������������������������������ 414
TypeScript Basics���������������������������������������������������������������������������������������������������������������������� 415
An Overview of TypeScript Syntax��������������������������������������������������������������������������������������� 415
Implementing a Basic TypeScript Application���������������������������������������������������������������������� 432
Setting Up a Sample Project������������������������������������������������������������������������������������������������ 432
Working with TypeScript Files��������������������������������������������������������������������������������������������� 437
NPM Packages��������������������������������������������������������������������������������������������������������������������� 440
Adding TypeScript���������������������������������������������������������������������������������������������������������������� 442
Summary���������������������������������������������������������������������������������������������������������������������������������� 467

xv
Table of Contents

Chapter 11: Building the Spy Store Web Application with Angular���������������������� 469
What’s Covered������������������������������������������������������������������������������������������������������������������������� 469
Create a New Visual Studio Core Project���������������������������������������������������������������������������������� 470
ASP.NET Project Files���������������������������������������������������������������������������������������������������������������� 472
Startup Class����������������������������������������������������������������������������������������������������������������������������� 472
Understanding App Component Setup�������������������������������������������������������������������������������������� 472
Understanding the Root index.html Page���������������������������������������������������������������������������� 473
Understanding the Root App Component����������������������������������������������������������������������������� 474
Understanding the App Module������������������������������������������������������������������������������������������� 475
Create Angular Bootstrap���������������������������������������������������������������������������������������������������� 476
Core Concepts��������������������������������������������������������������������������������������������������������������������������� 477
Application Initialization������������������������������������������������������������������������������������������������������ 478
Components������������������������������������������������������������������������������������������������������������������������ 479
Services������������������������������������������������������������������������������������������������������������������������������� 481
Templating��������������������������������������������������������������������������������������������������������������������������� 483
Routing�������������������������������������������������������������������������������������������������������������������������������� 488
Building the SpyStore Angular App������������������������������������������������������������������������������������������� 491
Add Routing������������������������������������������������������������������������������������������������������������������������� 492
Connecting to Services�������������������������������������������������������������������������������������������������������� 497
Route Parameters���������������������������������������������������������������������������������������������������������������� 503
Search Page������������������������������������������������������������������������������������������������������������������������ 505
Product Details Page����������������������������������������������������������������������������������������������������������� 510
Cart Page����������������������������������������������������������������������������������������������������������������������������� 517
Checkout����������������������������������������������������������������������������������������������������������������������������� 525
Summary���������������������������������������������������������������������������������������������������������������������������������� 527

Chapter 12: React������������������������������������������������������������������������������������������������� 529


Solution Overview��������������������������������������������������������������������������������������������������������������������� 530
Creating the App����������������������������������������������������������������������������������������������������������������������� 531
NPM Packages and Scripts������������������������������������������������������������������������������������������������������� 534
TypeScript Setup����������������������������������������������������������������������������������������������������������������������� 539

xvi
Table of Contents

Initial Project Structure������������������������������������������������������������������������������������������������������������� 541


Introduction to React����������������������������������������������������������������������������������������������������������������� 541
Components������������������������������������������������������������������������������������������������������������������������ 542
Application Organization����������������������������������������������������������������������������������������������������� 548
Models��������������������������������������������������������������������������������������������������������������������������������� 549
API Services������������������������������������������������������������������������������������������������������������������������� 550
Environment Variables��������������������������������������������������������������������������������������������������������� 554
Initial Components��������������������������������������������������������������������������������������������������������������� 556
Routing�������������������������������������������������������������������������������������������������������������������������������� 558
App Component������������������������������������������������������������������������������������������������������������������� 561
CategoryLinks Component�������������������������������������������������������������������������������������������������� 567
Products Component����������������������������������������������������������������������������������������������������������� 571
ProductDetail Component���������������������������������������������������������������������������������������������������� 579
Cart Component������������������������������������������������������������������������������������������������������������������� 585
CartRecord Component������������������������������������������������������������������������������������������������������� 591
Styles���������������������������������������������������������������������������������������������������������������������������������������� 594
Deployment������������������������������������������������������������������������������������������������������������������������������� 595
Additional Thoughts������������������������������������������������������������������������������������������������������������������ 598
Summary���������������������������������������������������������������������������������������������������������������������������������� 600

Index��������������������������������������������������������������������������������������������������������������������� 601

xvii
About the Authors
Philip Japikse is an international speaker, Microsoft MVP,
ASPInsider, MCSD, PSM II, PSD, and CSM, and a passionate
member of the developer community. Phil has been working
with .NET since the first betas, developing software for over
35 years, and heavily involved in the agile community since
2005. Phil is coauthor of the best-selling C# and the .NET 4.6
Framework (http://bit.ly/pro_csharp) and Pro C# 7
(http://bit.ly/pro_csharp7), the Lead Director for the
Cincinnati .NET Users Group (www.cinnug.org), founded
the Cincy Deliver Conference (www.dayofagile.org), and
volunteers for the National Ski Patrol. During the day,
Phil works as the Director of Consulting and Chief Architect
for a boutique consultancy in Cincinnati. Phil always enjoys to learn new tech and is
always striving to improve his craft. You can follow him on Twitter via www.twitter.com/
skimedic and read his blog at www.skimedic.com/blog.

Kevin Grossnicklaus was at one point in his career the


youngster on most development teams. He got his start
developing with Visual Studio and managed .NET code
during the early beta cycles in 2001. In 2009, Kevin founded
a software product development firm called ArchitectNow
(www.architectnow.net). At ArchitectNow, Kevin and his
team specialize in a wide variety of tools while delivering
applications across a variety of cloud and mobile platforms.
Born in rural Nebraska, he has spent the last 20+ years in St.
Louis, Missouri, with his wife Lynda and their three daughters,
Alexis, Emily, and Hanna. He is an avid guitar player, fly
fisherman, home brewer, and gamer (including everything
from retro arcade games to board games, to role-playing games). When he’s not spending
time on any of those hobbies, he waits patiently for a second season of Firefly.

xix
About the Authors

Ben Dewey is a former Microsoft MVP and published


author with over 18 years of experience writing applications.
He continually strives to create SOLID applications of the
highest craftsmanship while paying special attention to
clean user experiences (UX). Ben is currently leading the
User Experience team at Tallan, Inc. and consults regularly
in New York City and around the country on web- and
cloud-­based technologies. He has also worked to deploy
numerous high-quality, engaging apps to the Windows
Store. When he’s not consulting, Ben is busy training,
mentoring, blogging, and speaking at various conferences
and community events around the country. Outside of
work, Ben spends most of his time playing with his three young kids, working around
the house, or, if it’s windy, kite surfing. You can find him online on Twitter (@bendewey),
StackOverflow, GitHub, or on his blog at http://bendewey.com.

xx
About the Technical Reviewer
Eric Potter is a software architect for Aptera Software
and a Microsoft MVP for Visual Studio and Development
Technologies. He works primarily in the .NET web platform,
but loves opportunities to try out other stacks. He has been
developing high-quality custom software solutions since
2001. At Aptera, he has successfully delivered solutions for
clients in a wide variety of industries. He loves to dabble in
new and exciting technologies. In his spare time, he loves to
tinker with Arduino projects. He fondly remembers what it
was like to develop software for the Palm OS. He has an amazing wife and five wonderful
children. He blogs at http://humbletoolsmith.com/, and you can follow him on Twitter
as @pottereric.

xxi
Acknowledgments
Philip Japikse: This first edition of this book could not have happened without the very
talented (and patient) team at Apress. The idea for this book started when .NET Core
was still called ASP.NET 5, and the ride from ASP.NET 5 to Visual Studio 2017 has been
an interesting one, to say the least. This book also couldn’t have happened without my
loving wife, Amy, and all of the time she spent copyediting for me (for free) to keep my
words from being a jumbled mess. I also want to thank my coauthors for all of their
hard work. The goal of this book is to cover multiple technologies, and without their
dedication to the cause, this book would have died a long time ago. Finally, I have to
thank my children for their patience and understanding. Now that we are done, we can
get out on the slopes and make a few turns!
Kevin Grossnicklaus: First, I’d like to express my extreme gratitude to Phil and Ben
for the opportunity to be a part of this book at all. It has been a lot of fun and something I
am honored to be a part of. An equally large thank you goes out to the team at Apress for
being patient and helping pull everything together. Writing about technologies during
their beta cycle is always challenging, and getting three authors (including a chronically
slow one like myself ) to the finish line deserves some type of medal. Next, a shoutout
to my team at ArchitectNow for pushing me to keep on top of technology just as much
now as I did early in my career. I am constantly amazed at all the cool technologies and
products we get to use on a daily basis. That said, who knew we would be writing this
much JavaScript in 2017? Finally, to my awesome wife, Lynda, and my three beautiful
daughters, Alexis, Emily, and Hanna, thanks for putting up with all the time I spend
working, writing, or with all my other random hobbies. I love you all very much!
Ben Dewey: I’d like to thank a number of people who made this book happen. When
Phil came to me with the dream to create a book for .NET developers and architects
that would help navigate the real-world challenges and decisions that teams need to
make, I was all in. His vision and direction helped shape the complete story that we
delivered in this book. I’d also like to thank Apress and their wonderful team for their
help and guidance while we chased the changes and releases of Visual Studio 2017

xxiii
Acknowledgments

through multiple RCs. My employer, Tallan (www.tallan.com), has continued to enable


me to grow and reach communities around the country. They have allowed me to attend
and speak at conferences throughout the year and have worked with me to foster an
environment that respects knowledge and great software. Most importantly, thanks to
my family, who put up with me and my long hours to deliver this book and supports me
and my passions.

xxiv
Introduction
The idea for this book came out of a discussion among conference speakers about the
problem with keeping up with technology. Not only the rapid fire and revolutionary
changes in the .NET ecosystem but also the proliferation of JavaScript frameworks.
I stated to the group:
“There needs to be a book designed to get someone up to speed on ASP.NET 5
and help them make informed decisions about which JavaScript framework (if any)
to use. The problem is that the material on the popular JavaScript frameworks is too
comprehensive. We need to have a book that gives enough information to enable
informed decisions without having to invest weeks learning a framework that might not
be a fit. Following the fail fast mantra from lean.”
A silence fell over the group. They all looked at me and said, “Great idea! When are
you going to write it?”
Thus, the first edition of this book was born, at least in concept. While I knew I
could handle the .NET Core part of the book, I was really a customer for the second half
of this book, having little exposure (at the time) to the modern JavaScript frameworks.
I reached out to two of my long-time friends, Ben and Kevin, and asked them if they
would be interested in authoring the second half of this book. I knew they are deeply
immersed in many of the JavaScript frameworks and would be a great match to round
out the writing team.
This edition covers .NET Core 2.1, which is the current LTS version of .NET Core.
This is also the version of .NET Core that still works with the .NET Framework.

The Goals of This Book


After much discussion, we settled on two main goals for this book. The first goal is to
bring the .NET developer up to speed on .NET Core, including Entity Framework (EF)
Core and ASP.NET Core. The second goal is to cover different JavaScript frameworks,
client-side build tools, and TypeScript. Each of the web applications will consist of the
same UI and functionality, and all will use the same ASP.NET Core RESTful service and
database as the backend.

xxv
Introduction

Introducing the SpyStore Database


To keep the sample applications a reasonable size, we settled on a derivative of the
IBuySpy database. This database shipped as a sample application in the.Net Framework
1.1 SDK, and I have been using a derivative of it as a test model ever since. The database
design (rebranded SpyStore for this book) is simple enough to use for clear teaching, but
complete enough to be a solid, workable base for writing this book. Figure 1 shows the
ERD of the SpyStore database.

Figure 1. The SpyStore database

Introducing the SpyStore Web Site


Based on the SpyStore database and the list of features we wanted to show for each
framework, the UI was completely reimagined and created by Ben Dewey, one of our
coauthors. The site is very simple, consisting of the following pages.

xxvi
Introduction

The Home Page


The home page is also the Product list page, showing the Featured Products. Products
can also be displayed for each Category by selecting one of the dynamically created
menu items at the top of the page. The top right has links for the Shopping Cart and
Order History pages as well as the Search box. Figure 2 shows the home page listing the
featured products.

Figure 2. The home page with the featured products

The site is also responsive, and it will alter its UI based on the view port. Figure 3
shows the home page as viewed on a mobile device.
xxvii
Introduction

Figure 3. The home page on a mobile device

xxviii
Introduction

The Details/Add to Cart Page


The Product Details page doubles as the Add to Cart page. It’s shown in standard view in
Figure 4 and on a mobile device in Figure 5.

Figure 4. The Product Details/Add to Cart page

xxix
Introduction

Figure 5. The Product Details/Add to Cart page on a mobile device

The Cart Page


The Cart page demonstrates the bulk of the work in the application, with methods to
add, delete, and update Shopping Cart records. The Cart page is shown in standard view
in Figure 6. The mobile view isn’t any different, it’s just smaller.

xxx
Introduction

Figure 6. The Cart page

The Order History Page


The Order History page shows all of the top line details for a Customer’s orders.
The full-­screen version is shown in Figure 7, and the mobile device version is shown in
Figure 8.

Figure 7. The Order History page

xxxi
Introduction

Figure 8. The Order History page on a mobile device

The Order Details Page


The Order Details page shows all of the details for an order, and it is shown in standard
view in Figure 9 and on a mobile device in Figure 10.

Figure 9. The Order Details page


xxxii
Exploring the Variety of Random
Documents with Different Content
deux cygnes de marbre blanc, penchés sur une immense vasque
d’argent, faisaient courir, par leur bec, une eau tiède et parfumée.
Devant chaque glace un oranger, chargé de fruits électriques, versait
une lumière caressante et dorée.
Plus large que les autres, encadrée d’un filet de bronze, une des
glaces dominait, celle du fond. Des corbeilles d’azalées en
soulignaient la base.
— Mais ce n’est pas une salle de bains, murmurait Françoise,
c’est un temple ! L’oncle Provence appellerait ça : la Piscine des
Hespérides !
Elle n’avait pas perdu toute gaieté et, une seconde, elle fut
tentée… Les émotions de la journée précédente, comme celles de la
nuit, l’avaient rendue lasse. Un bain réparateur s’offrait à elle dans
un décor surprenant. Elle eut, instinctif, un geste vers sa robe pour
la dégrafer. L’eau murmurante semblait l’appeler…
Mais un obscur sentiment de prudence la retint. Elle poussa la
porte, à regret, et procéda à ses ablutions dans le cabinet de toilette
où elle s’était arrêtée la nuit.
Pendant ce temps, par la fenêtre ouverte, la Triestine scrutait les
environs. Le château où l’on avait entraîné Mlle de Targes était situé
au milieu d’un parc immense dont les arbres, pour la plupart
séculaires, paraissaient d’une telle hauteur qu’ils masquaient
l’horizon. La suivante remarqua seulement qu’à sa droite un lourd
portail de fer, aux rosaces compliquées, semblait couper le parc en
deux parties distinctes. C’est par là qu’elles étaient venues.
— Descendons, Marina.
Françoise entraînait la brunette.
Elles trouvèrent, devant elles, toutes portes ouvertes. Cette
apparente illusion de liberté leur parut favorable.
— Allons, allons, pensa plus allègrement Françoise, je ne suis pas
encore tout à fait prisonnière.
Elle s’était réjouie trop tôt. Après dix minutes de promenade dans
le parc, Marina poussait un cri où il entrait autant de colère que de
déception.
— Voyez, Signorina ! Il y a un mur !
La propriété était, effectivement, enclose d’une épaisse muraille
de pierre grise, haute de plus de trente mètres, qui rendait
impossible toute tentative d’évasion…
Elles revenaient sur leurs pas, lentes et déçues, quand, au détour
d’une allée, la seconde surprise les guettait.
Une femme, jeune encore, d’allure dégagée, leur souriait, en
cueillant des roses. Les jeunes filles s’arrêtèrent, stupéfiées…
L’inconnue s’avançait vers elles, délibérément. Alors Françoise la
détailla mieux. Malgré l’heure matinale, elle remarqua la richesse
d’un déshabillé luxueux. Sur des cheveux blonds, évidemment
oxygénés, une capeline à larges brides de velours noir était jetée.
Fraîche sous son fard, avec une grâce apprêtée, elle donnait un peu
l’impression d’une actrice, « tournant » un rôle filmé. De plus près,
cette femme, grande et vigoureuse, aux hanches puissantes, aux
bras blancs et musclés, aux mains fortes, paraissait accuser une
trentaine bien défendue. La vivacité des yeux trop noirs, la vulgarité
d’un nez canaille et d’une bouche charnue, nuisaient à l’élégance de
l’ensemble.
— Mademoiselle, dit-elle dans un français nuancé d’un
langoureux accent slave, permettez à une Russe de se présenter. J’ai
nom Técla Dortnoff. Personne n’est là pour l’une à l’autre nous faire
connaître. Oh ! Je déplore vraiment !…
Le mutisme de Françoise, au lieu de la dissuader de poursuivre
un tel entretien, parut, au contraire, lui servir d’encouragement.
— Voulez-vous ? Marchons un peu. Si matin, en remuant, le sang
circule facile. Moi, j’ai besoin de marcher. Il faut. Cela est bon. Donc,
c’est le secret de se bien porter. Si vous êtes bien portante, Dieu
vous protège ! Moi, je fais tous les sports. Des armes, du cheval, de
la boxe. Dites quoi ? Rien, je ne crains que seulement Dieu le Père !…
J’étais dans le sommeil, à votre arrivée, hier. Quel regret !… Vers les
cinq heures, tout au jour, je me lève : La douche. Le thé. Dehors !…
Ainsi, j’ai rencontré Basile, en descendant respirer dans le parc.
Basile Ardessy est à moi comme un très vieux bon ami. Il avait
beaucoup d’attachement à mon premier mari, mort en duel. Michel,
le second mari, — devinez ! — il est à Pétersbourg, dans la maison
des fous !… Voilà comment, à ainsi dire, je suis une presque veuve.
Quelle douleur !… Je prends le repos ici, pendant l’été. Cela me
calme. Ce vieux cher Basile, il vient de me dire que vous veniez aussi
pour quelques semaines. Je suis heureuse, vraiment !
Françoise, qui l’avait écoutée avec un sentiment de profonde
surprise, l’interrompait, véhémente :
— Monsieur Ardessy a menti, madame ! C’est un misérable ! Je
suis victime d’une aventure odieuse. J’ignore pour quelle raison vous
tenez à m’exprimer une sympathie aussi subite qu’inexplicable. Je ne
veux connaître personne dans cette maison. Je ne réclame que la
liberté ! Si vous êtes sa messagère, je vous charge de le lui dire. Et
cela sans tarder !
L’étrangère manifestait le plus grand étonnement. Un air
scandalisé avait glacé la mobilité de ses traits.
— Entendez comme elle parle, cette petite !… Voilà un
scandale !… Vous êtes, je pense, comme Michel qui se trouve dans la
maison des fous ! Alors, Pauvre, que Dieu vous protège !… Sinon,
vous faites la morsure dans la main de celui qui vous reçoit. Quelle
honte ! l’ingrat mérite le fouet !…
Et, afin, sans doute, de donner à ses paroles un commentaire
significatif, d’une branche de rosier, arrachée à la botte de fleurs
qu’elle tenait contre son sein, elle sabra l’air furieusement. Puis,
haussant les épaules avec mépris, sans même daigner se retourner,
à pas rapides, elle s’éloigna…
— Mais c’est elle qui est folle ! concluait Françoise, à la fois
inquiète et troublée.
Puis, prenant le bras de la Triestine :
— Nous ne reviendrons plus de ce côté, Marina. Allons vers la
grille.
Ah ! cette grille !… Hallucinante et tentatrice, elle semblait
posséder à leurs yeux comme une mystérieuse attirance… Mais à
peine Marina s’en était-elle approchée que, d’un petit bâtiment qui y
attenait, — le logis du gardien, — un véritable monstre avait surgi.
La petite reculait, épouvantée.
Taillé en géant et balançant des poings formidables, un portier
galonné déclarait d’une voix de stentor, où les mots allemands
roulaient en fracas impétueux :
— Der Durchgang ist verboten ! (On ne passe pas !)
Françoise de Targes était bien prisonnière.
VIII
Sous le Fouet.

Dix minutes plus tard, dans la chambre à coucher d’Ardessy,


située au rez-de-chaussée de la mystérieuse demeure, Técla, riant à
belles dents, du rire insultant et cynique des filles, Técla, la tête
renversée sur l’épaule de son amant Basile, moelleusement calé
dans ses oreillers, mimait, en forçant la note, la surprise effarée de
Françoise et son accès d’indignation.
— Joyeux chéri, disait-elle, en caressant la moustache fauve du
Comte, tu es donc déjà un homme misérable, voué au mépris ? Elle
te déteste, sais-tu, cette farouche dinde ?
— Tu exagères !… Ce n’est pas un oiseau, c’est une fleur…, une
fleur de France !
— Virginale ?…
— Tout porte à le croire.
— Alors, c’est un bouton.
Ils éclataient de rire.
En passant sous silence la liaison qui la rivait, depuis plusieurs
années, à Basile Ardessy, Técla avait audacieusement, dans le
brusque entretien qu’elle avait eu avec Françoise, — et de concert
avec son amant, — dit, à certains détails près, la vérité sur sa vie.
Ses origines étaient obscures.
Née à Pétersbourg, elle avait débuté très jeune dans la plus
basse galanterie. Un soir d’ivresse, en soupant avec cette passante,
racolée au hasard, Dimitri Oulianof, capitaine aux gardes, s’était pris
pour elle d’une passion si forte qu’elle le conduisit d’abord au
mariage, puis à la ruine, finalement au suicide.
Afin de parer aux prodigalités de sa femme, Oulianof s’était mis à
jouer. Il vola. Sur le point d’être arrêté, il s’enfonça entre les dents
son revolver d’ordonnance et tira… Les éclats de sa cervelle avaient
rejailli jusque sur les vitres de sa chambre…
Técla ne fut pas inquiétée. Elle possédait des relations. Ayant
tâté du théâtre, sans grand succès, sa plastique y fit cependant la
conquête de l’homme dont elle portait le nom, Michel Dortnoff.
Faible et riche, ce dernier n’avait été, entre les griffes de la veuve
Oulianof, qu’une proie trop facile. Devenue Mme Dortnoff devant
l’archimandrite et devant la loi, elle donna libre cours au désordre de
ses passions.
Non contente de le trahir avec tous les hommes qu’elle trouvait à
son goût, et voulant chercher à satisfaire une curiosité des sens qui,
insatiable, allait en s’exaspérant, elle installa au domicile conjugal,
une hermaphrodite cueillie, comme elle l’avait été elle-même, dans
le plus fangeux ruisseau de Pétersbourg et qu’on ne connaissait dans
le monde des prostituées que sous le nom, crapuleusement abject,
de L’Esturgeon.
L’infortuné Michel, s’étant avisé de tenter un simulacre de
protestation, fut bâillonné par les mégères qui, lui ayant arraché ses
vêtements, et après l’avoir lié à la colonnade d’un lit, lui infligèrent
une volée de coups de canne, afin de lui apprendre à ne plus se
mêler des choses qui ne le regardaient pas ou plutôt… qu’il regardait
trop, car, devant le malheureux pantelant, elles s’étaient livrées à
l’exécrable jeu de leur simulacre d’amour…
En cette honteuse aventure, Michel perdit la raison. On l’interna.
Libre, Mme Dortnoff ouvrit alors un salon de jeu. Après avoir
donné à jouer, et voulant répondre à tous les goûts de sa clientèle,
elle donna à… aimer. Elle acquérait, peu après l’internement de
l’infortuné Michel, une maison sur les bords de la Neva. Dans les
salons ouverts sur la rue, on jouait au baccara. Au premier, on
soupait en joyeuse compagnie. Il y avait même des tableaux vivants
qui, toute une saison, firent fureur dans la bonne société. On
accourait chez la Dortnoff pour s’amuser et y trouver de l’inédit. Des
chambres accueillaient au troisième les couples trop surexcités.
« Chaque étage a ses plaisirs », avait coutume de dire
L’Esturgeon, promue à la dignité d’organisatrice des petits jeux
particuliers. Sa lubricité s’y entendait.
Enfin, le Fouet surgit !…
Qui l’amena ?… Un client quelconque, descendu là en costume de
cheval et ayant, par hasard, laissé traîner sa cravache sur un divan,
ou bien le détraquement toujours en éveil de L’Esturgeon ?…
Toujours est-il que la flagellation fut subitement de mode. La
Dortnoff refusait du monde.
Amené par un ami, Basile Ardessy, de passage dans la capitale,
s’engoua de l’étrange Hôtesse. Ces deux débauchés devaient
fatalement s’entendre, Basile étant, à sa manière, aussi dépravé que
sa maîtresse. Elle le suivit à Vienne, laissant sa maison hospitalière
aux mains diligentes de L’Esturgeon.
Ils se quittèrent. Ils se reprirent, après des échanges de propos
haineux, toute une sale ordure remuée entre anciens complices sur
le point de devenir ennemis. Finalement, elle l’avait maté, car il
possédait une âme plus « fille » que celle de Técla. Là encore, elle
avait vaincu, grâce au knout.
Après la sensation surexcitante du fouet, elle l’avait vu ramper à
ses pieds, sollicitant d’autres caresses, d’autres tortures aussi…
Chaque été, elle ne manquait pas de venir passer ses vacances
auprès de lui, dans ce petit château perdu près de la frontière
autrichienne, bâti du temps du Grand Frédéric et que Basile tenait
de ses aïeux.
Une dépêche reçue, la veille, de Felsburg, où Basile avait été
tenu de suivre le prince Hugo, avait averti la Dortnoff de son arrivée
nocturne, la priant de ne pas se montrer.
Lorsque Françoise fut installée au premier, il avait rejoint Técla, la
mettant au courant de la nouvelle folie du Prince.
La rencontre du parc avait été imaginée dès qu’ils avaient
entendu Françoise descendre de son appartement. Il fallait tenter de
l’humaniser, cette sauvage qui n’était peut-être qu’une subtile
roublarde, de lui arracher certaines confidences, en la guidant
adroitement vers des concessions. La Dortnoff s’était volontiers
chargée du rôle, mais comme Basile, volontairement ou non, avait
omis de la renseigner sur le peu d’estime où le tenait Mlle de Targes,
la rusée Slave, voyant que la conversation avait pris, avec Françoise,
un tour assez fâcheux, s’était sauvée, rompant les chiens.
— Pourquoi, reptile, as-tu abîmé la vérité ? insistait-elle auprès
d’Ardessy, presque couchée sur lui. A ainsi dire, c’est par
coquetterie ?… Toujours donc, tu seras une courtisane ? Chère vieille,
— railla-t-elle, — mais presque chauve tu es ! Quelle peine !… Pour
cette Françoise, tu entends, — n’est-ce pas ? — faire le cœur-joli ?…
Il protestait : — Quelle idée !
— Longtemps, il y a… — Des mois peut-être !… — Que le temps
passe !… — Longtemps il y a que tu n’as eu les caresses de ta chère
Técla… Cela te manque, roulure ?…
Peur ou plaisir ?… Le nez d’Ardessy palpitait. Une pâleur rendait
son visage plus blême. Du ton d’un enfant pris en faute, ou comme
s’il défaillait sous l’approche d’une jouissance trop violente, à la fois
crainte et désirée, il murmura, la voix changée :
— Técla !…
— Oui… Eh bien ! Técla va vous châtier, être abject ! Técla est
jalouse ! Vous entendez, vicieuse ordure ?… Jalouse !…
Elle courait à une panoplie de chasse, y cueillait une cravache et,
la faisant siffler, revenait au lit. La voix menaçante, le regard dur, elle
ordonna :
— Allons ! Chien !… Découvre-toi que je te rosse !
Enfoui dans les oreillers, sans bouger, il suppliait :
— Técla !…
Alors, elle s’approcha, rejeta violemment les couvertures et,
découvrant la nudité velue de l’homme, d’un geste impitoyable, elle
frappa, zébrant les fesses de larges rayures, criblant le dos,
fustigeant les jambes, le fouaillant jusqu’à ce qu’un hurlement de
plaisir succédât aux gémissements qu’il étouffait d’abord…
Il roulait à terre. Puis, d’un bond félin, se relevant, il sautait à la
gorge haletante de la femme et lui arrachant la cravache, il la
renversait, à son tour, sur le lit, en criant d’une bouche où bavait
l’écume :
— C’est à toi, maintenant, mon délice !… C’est à toi !… A toi !…
*
* *

Dans l’après-midi, le Prince arrivait en auto. Après avoir causé


avec Ardessy, cérémonieusement, et sans écouter les remarques de
celui-ci, il fit demander à Françoise la faveur d’un entretien. A peine
était-il en sa présence, qu’il se jeta à ses genoux, cherchant à baiser
une main, qu’elle dérobait, indignée, l’accablant des protestations les
plus passionnées.
La jeune fille l’écoutait avec une indifférence glaciale.
— Quand on aime une femme ainsi que vous le prétendez,
Monsieur, on n’a pas recours à un rapt. On ne force pas sa volonté.
Ce que vous avez commis, est une atteinte au droit des gens, un
crime impardonnable. Rendez-moi une liberté qui m’est précieuse et
à laquelle j’ai droit.
— Accordez-moi seulement une promesse, suppliait-il, implorant.
— Vous n’obtiendrez de moi ni engagement, ni promesse. Rien !
— Mais je vous aime, Françoise ! Je vous aime à la folie, à en
mourir !
— Soit. Moi, je ne vous déteste pas : je vous hais.
— La haine, ô mon beau Lis, n’est-elle pas proche de l’amour ?
— Divagations !… Je refuse de vous entendre.
Il se retirait à pas lents, non sans avoir une fois encore
vainement essayé de caresser ses doigts d’un furtif baiser.
Basile Ardessy guettait la descente du Prince. Il guidait ses pas
vers le boudoir attenant à la chambre où Técla lui donnait, si l’on
peut dire, toutes les « marques » de son affection…
— Où en êtes-vous ?
— Elle réclame sa liberté.
— Vous n’obtiendrez rien d’elle par la douceur.
— Je suis persuadé que si.
— Je persiste à croire le contraire.
— Je ne veux la tenir que d’elle-même. Tu verras, j’arriverai à la
convaincre de mon ardent amour. J’obtiendrai son consentement.
— Oui. Par le fouet.
— Que me chantes-tu là ?… Mlle de Targes n’est pas une esclave.
— D’accord. C’est une femme qu’il convient d’amener à
résipiscence. Avec le caractère que je lui connais, vous n’arriverez à
un résultat que par ce moyen. La manière forte !
— Jamais elle ne me le pardonnerait !…
— Rapportez-vous en à mon expérience et laissez, je vous prie,
Mme Dortnoff agir à sa guise.
— Comment, ta maîtresse est ici ? s’exclamait Hugo, presque
mécontent.
— Quel gros mot !… Técla n’est pas ma maîtresse…
— Je me trompais, raillait le Prince. C’est, en effet, plutôt ton
« maître »…
Basile, affectant un air vexé, se mordait les lèvres.
— Mme Dortnoff villégiature ici pendant la belle saison, répliqua-t-
il avec assez d’aigreur. Je ne croyais pas que sa présence pût
déplaire à Votre Altesse, en mettant hier cette discrète demeure à sa
disposition.
— Ardessy, mon vieux, la dignité ne te sied pas. J’ai manifesté de
la surprise, voilà tout. Évidemment, j’eusse préféré que Françoise
demeurât seule ici avec la fille qui l’accompagne.
— Et qui est bien gênante. Quelle glu !…
— D’accord. Mais Françoise paraît, tu me l’as dit, tenir beaucoup
à elle.
— Nous saurons l’éloigner en temps voulu.
— C’est à voir. Je reviendrai demain.
— Pourquoi ne vous installez-vous pas ici ? Le rez-de-chaussée
m’abrite. Notre belle exilée se cache au premier. Installez-vous au
second.
— Tu me tentes, démon !…
— Allons, restez, Prince. Vous ferez la paix avec Mme Dortnoff.
— Qui t’a dit que nous fussions fâchés ?…
— Au contraire, répliquait Ardessy avec un sourire ambigu. Il y
eut même, à Vienne, certaine soirée, où le hasard nous mit, tous
trois, sur un pied d’intimité dont vous n’avez pas, je gage, perdu
tout souvenir…
— Ne me rappelle point de telles faiblesses…
— Deviendriez-vous vertueux ?…
— Sait-on jamais ?
*
* *

Le soir, en s’asseyant à la table que les nègres dressaient pour


dîner dans le boudoir mauve, Mlle de Targes trouvait sous sa
serviette, un écrin, plus large que celui qu’elle avait reçu à Felsburg.
Il portait ses initiales : F. T.
La nièce de Moune le repoussait avec autant d’agacement que de
dédain. Curieuse, Marina sollicita la permission de l’ouvrir.
— Ève sera donc éternellement tentée ! murmura Françoise avec
une moue indulgente. Eh bien, ouvre, Pandore !
La Triestine eut une exclamation d’extase.
L’eau merveilleuse d’une rivière de diamants coulait, étincelante
et splendide, entre les doigts brunis de l’Italienne. Cette parure était
d’une inestimable beauté.
— Remettez ces pierres dans leur écrin et rendez le tout au valet
qui fait le service, commanda la jeune fille en se levant aussitôt.
Cette attitude ne changea en rien la conviction du Prince, car
chaque journée qui s’écoulait, interminable, amenait, à la même
heure, sa visite, immédiatement suivie d’un fastueux cadeau.
Un nécessaire de voyage en vermeil précéda sans succès des
perles du plus pur orient. Un coffret d’ivoire, dû au patient génie
d’un artiste chinois et contenant des dentelles anciennes, blonde et
point d’Argentan, suivit. Un somptueux manteau de zibeline clôtura
la série des prodigalités, sans amener autre chose qu’un sourire
d’écrasant mépris sur le visage de l’irréductible captive.
Intentionnellement, elle laissait toutes ces richesses à l’abandon.
Le Prince les retrouvait, à sa visite du lendemain, à la place où elles
avaient été trouvées la veille. Sans se lasser, il présenta lui-même à
Françoise un mince étui de soie fanée.
— Je ne me suis jamais permis de vous offrir directement la
moindre chose. Je vous demande, par exception, de jeter les yeux
sur ce petit souvenir qui, peut-être, aura l’heur de vous agréer.
Et il déployait les branches d’écaille d’un délicieux éventail, dont
la signature eût fait l’orgueil d’un musée. Ce chef-d’œuvre était signé
François Boucher.
— Il me vient de ma mère, assurait Baghzen-Kretzmar d’une voix
câline où perçait, néanmoins, le tremblement d’une émotion qui
n’était pas feinte. Nulle mieux que vous ne me paraît plus digne de
s’en servir. Ne serez-vous pas mienne quelque jour ?
— C’est de l’aberration. Je répète, Monsieur, que vous êtes fou !…
— Fou ? Oui. D’amour… Ah ! Françoise, consentez à vous laisser
chérir et vous serez la plus heureuse des femmes !
— J’ai le malheur d’être scrupuleuse et j’ai aussi la franchise de
vous déclarer que vous n’avez pas choisi pour me convaincre le
meilleur moyen. Ne comprenez-vous donc pas que vous me faites
horreur ? horreur !…
— Bientôt, ma divine, vous changerez d’avis, répondait Hugo,
soudain flegmatique. Vous réfléchirez. Il ne tient qu’à vous de
m’avoir pour esclave. Veuillez vous le rappeler.
Il tenait Françoise en son pouvoir. De sûrs gardiens veillaient sur
elle. Persuadé qu’elle ne pourrait lui échapper, il ne se lassait point
de ses refus continuels, non plus que de la blessante hostilité qu’elle
ne cessait de lui témoigner.
— Elle se fait désirer, ricanait Técla, à qui le Prince rapportait
fidèlement les propos de Françoise. C’est calcul pur ! Quelle audace !
Son Altesse ne voit-elle pas le traditionnel manège ? Vous l’aurez, la
sauvage colombe !… Vous l’aurez !… Mais vous ne l’aurez qu’à l’une
de ces deux conditions : devant le prêtre ou après le fouet. Le fouet
vaut mieux.
Et Ardessy faisait chorus :
— Souvenez-vous du dicton hongrois : « Quand le vent secoue
l’arbre, le fruit tombe. » Soyez le vent !
— Et même la tempête !… soulignait la Dortnoff. Cassez les
branches !
— Reconnaissons, ajoutait Ardessy, qu’il y a des fruits qui ont de
plus mauvaises chutes. Celui-là tombera dans un panier… royal.
— Ne va pas te méprendre, Basile, répliquait le Prince. Cette
jeune fille est, somme toute, de vieille noblesse. Je n’hésiterais
même pas, s’il le fallait absolument, à l’épouser. Il y a eu, dans la
maison de l’Empereur, de pires mésalliances. Françoise réfléchira.
Qu’elle consente seulement à me suivre et nous filons aussitôt en
Espagne, où je suis maître absolu chez moi. Là-bas, j’en ferais, si
bon me semble, ma femme devant Notre Sainte-Mère l’Église. Nous
attendrons ensuite les événements.
— Les événements ne vous attendront pas, Monseigneur.
Oubliez-vous la guerre ? L’ordre de mobilisation s’apprête.
Le Prince devenait morne. Anxieusement, il consultait son ami :
— C’est vrai. En ce cas, mon cher, que faire ?
Le Comte, haussant les épaules, faisait entendre un mauvais rire.
Mais Técla intervenait, une flamme aux yeux.
— Que faire ? Mais me laisser agir. Me donnez-vous tous les
pouvoirs ?
Il eut un geste découragé signifiant : « Faites ce que vous
voudrez ! »
Elle triomphait.
— Demain, je lui rends visite. Après-demain, et nous avons ici
pour cela des moyens certains, vous aurez la proie et bien matée !…
Palpitante et ravie, elle sera la tourterelle apprivoisée. Allez, Prince !
Que Dieu vous garde !…
IX
Flagellée !…

Depuis les quinze jours que durait sa séquestration, Françoise


avait adressé lettres sur lettres à Mlle Corbier et à Jacques Provence.
Elle ne s’illusionnait pas sur leur sort, se doutant que nulle d’elles
n’arriverait à destination, bien que Marina les eût remises, non aux
valets noirs, mais au portier, monstre à tête de bull-dog, qui
adressait à la soubrette, chaque fois qu’il la rencontrait, un hideux
sourire où la jeune fille, dans sa détresse — et en dépit du
traditionnel : « On ne passe pas ! » — avait cru discerner un
semblant de bienveillance.
Le personnel domestique avait reçu l’ordre formel d’être muet.
Impossible de savoir en quel lieu elles se trouvaient.
Le maître d’hôtel, et les deux Abyssins venaient prendre les
ordres de Mlle de Targes et les exécutaient sans desserrer les lèvres.
L’amour-propre de la prisonnière était trop grand pour qu’elle
consentît à s’abaisser en les questionnant.
Rina, elle, ne s’embarrassait pas des mêmes scrupules. Elle avait
fureté, dans tous les coins de l’étage que Françoise ne quittait plus,
sans pouvoir découvrir le moindre indice qui permît d’apporter à sa
maîtresse une précision quelconque sur l’endroit où la volonté de
Baghzen-Kretzmar les tenait enfermées.
Il ne fallait attendre un secours que de Jacques Provence.
Moune et lui, pour la première fois de leur vie, peut-être, avaient
dû s’entendre. Pauvre Moune ! Que devait-elle penser du silence de
Françoise, depuis deux semaines que celle-ci avait quitté Felsburg,
était cloîtrée ?… Sans doute avait-elle écrit à l’Altesse, télégraphié ?…
Combien de temps mettraient-ils, tous deux, à découvrir cette
retraite, perdue dans la verdure, à plusieurs heures de Felsburg ?
Comment leur serait-il possible de retrouver sa trace ? Ils avaient dû
s’informer auprès de l’ambassadeur d’Allemagne ? Une enquête avait
certainement été prescrite, exigée ?…
Qui sait même si Provence ou Mlle Corbier n’étaient pas en route ?
Il fallait attendre. Et Françoise, malgré tout son courage, toute son
énergie, se désespérait…
Bien que le Prince se fît chaque jour plus pressant, elle ne
désarmait point, observant la même rigueur inflexible.
Plus la passion de Hugo allait s’exaspérant et plus l’antipathie de
la jeune fille à son égard s’accroissait. La seule vue de cet homme lui
était devenu insupportable. Elle ne répondait plus que par
monosyllabes à tout le fatras désordonné de ses protestations.
A quel motif obéissait-elle ? Combien d’autres, à sa place,
eussent-elles succombé devant ces richesses qu’elle repoussait,
devant ce titre, devant cet amour délirant qui, au contraire, lui
faisaient horreur ?…
Françoise, la droiture même, ne comprenait pas que le Prince ait
pu manquer à ses engagements envers l’Altesse, renier une parole
donnée. Elle ne lui pardonnait pas, en outre, la déshonorante
séquestration dont elle souffrait, les inimaginables angoisses par
lesquelles devait passer, devant cette brusque disparition, la
tendresse maternelle de la tumultueuse Moumoune. Comment tout
cela finirait-il ?… Par un drame inévitable, car elle était décidée au
meurtre au cas où Baghzen, soit dans un moment d’égarement, soit
sur les instigations du venimeux Ardessy, viendrait à porter la main
sur elle.
Au cours d’un repas, sans même être aperçue de Marina, elle
avait glissé dans sa poche, avec un geste de voleuse, un couteau à
manche d’argent qui ne la quittait plus… Elle était décidée, si cet
homme exécré venait à tenter sur elle quelque violence, à en faire le
plus terrible usage.
Depuis sa rencontre inopportune avec l’étrange amie d’Ardessy,
elle n’était plus retournée dans le parc, sachant que le trio guettait
avec avidité ses moindres allées et venues.
Par les fenêtres ouvertes, le cynisme du rire de la Dortnoff
montait à ses oreilles comme un vivant outrage. Des voix d’hommes
lui répondaient et, à maintes reprises, Françoise avait nettement
reconnu celle, plus grave, un peu nasillarde, du Prince.
Marina, elle, sortait chaque matin vers neuf heures. La fine
mouche, qui ne désespérait pas d’apprivoiser le monstrueux
Augustus, terminait sa promenade par un brin de causette sur le
seuil de la loge du cerbère. Il riait lourdement aux taquineries de la
petite, mais ne lâchait rien.
Ce matin-là, la fillette venait à peine de descendre lorsque
Françoise entendit frapper à sa porte. Elle ouvrit, pensant à quelque
étourderie. Ce fut Técla qui, hardiment, entra :
— Bonjour ! Vous êtes plus sage, j’espère maintenant, Belle
Fleur ? Donc déjà, j’ai à vous parler de très importantes choses. Ne
me regardez pas comme une bête d’épouvante. Cela désoblige !
— Je ne veux avoir aucun entretien avec vous, madame. Sortez !
— Sortir ? Et pourquoi ?… Je suis bien. Il faut apprendre que
notre Prince est galant homme. Il faut montrer de la raison. Il faut le
laisser vous aimer. Quelle douceur !… Cela est le plus agréable du
monde, croyez-moi : Après, vous verrez la vie toute rose. Pourquoi
faire l’oiseau méchant, plumes hérissées, bec ouvert ?… Pourquoi, je
le demande ? Où le résultat ? Quelle pitié !… Réfléchissez !
— C’est tout réfléchi. Allez-vous en !
— Ce que vous refusez par bonne grâce, on l’aura par la force.
— Sortez !…
— Donc, vous êtes détestable. Alors, c’est le dernier des mots ?
Vous ne céderez pas ?
— Jamais !
— Que Dieu vous damne !…
Et la Dortnoff claquait la porte.
Or, Marina ne rentra point…
Énervée par la visite comminatoire de la Dortnoff, Françoise
s’inquiéta tout d’abord de cette absence prolongée, puis s’en alarma.
L’heure du déjeuner arriva sans que la jeune fille reparût. Contre son
habitude, Françoise interrogea le maître d’hôtel.
— Savez-vous où se trouve ma femme de chambre ?
— Non, mademoiselle.
— L’avez-vous aperçue ce matin ?
— Non, mademoiselle.
Elle n’en tirerait rien. Elle comprenait que la Dortnoff avait
commencé les hostilités. Elle grignota un peu de poulet, dont elle
trouva la sauce atrocement pimentée, prit un fruit et, très altérée,
sans vouloir toucher au vin, elle se versa un grand verre de l’eau
d’une carafe rafraîchissant dans un seau de glace. Ce breuvage lui
parut exquis ; cette eau fraîche avait une saveur de menthe. Elle en
reprit une seconde fois, refusa qu’on lui servît le café, puis,
s’accoudant à la fenêtre, elle s’entêta dans l’espoir de voir surgir
Marina, mais accablée par la chaleur, et comme pénétrée d’un feu
qui brûlait ses veines, elle céda au besoin de s’étendre sur une
chaise longue.
Deux heures lentement passèrent sans qu’elle parvînt à fermer
les yeux, non qu’elle luttât contre le sommeil, mais elle était en proie
à un malaise singulier. Était-ce réellement la chaleur qui, en dépit
des stores baissés, l’incommodait à tel point ? Elle avait la sensation
d’être, de la tête aux pieds, piquée par de dévorants moustiques.
Elle se leva, s’ablutionna d’eau froide.
Bien qu’aucune rougeur ne marquât la peau, l’irritation, loin de
se calmer, s’accrut. La sensation était devenue si intolérable qu’elle
songea, étant seule et faisant abandon de toutes ses défiances,
qu’un séjour prolongé dans l’eau de la vaste baignoire lui serait
salutaire.
Elle entr’ouvrit la porte donnant sur la piscine des Hespérides. Il
y régnait une fraîcheur idéale. Le murmure de l’eau chantait,
tentateur, dans la vasque d’argent…
La robe de Françoise tomba sur les fleurs pourpres du tapis
d’Anatolie. Puis ce fut le tour du corset. La chemise ajourée, où
transperçait la roseur des seins, glissa, en cercle pâle, à ses pieds.
Elle s’assit sur la première marche de porphyre afin de délivrer ses
jambes de la gaine de soie où elles étaient emprisonnées.
Maintenant, elle était nue, nue comme la déesse Aphrodite elle-
même !
A bon droit, Moune pouvait qualifier sa nièce de « chef-d’œuvre ».
Le corps de Françoise eût tenté le ciseau du sculpteur le plus difficile
dans le choix d’un modèle.
La splendeur nacrée d’une chair liliale et l’harmonieuse perfection
des formes de ce marbre vivant tendant, avec une grâce pudique,
son petit pied aux ongles d’agate, vers la caresse de l’eau, était un
enchantement. Elle risqua une jambe, puis l’autre et, dans un
clapotis d’eau jaillissante, elle se laissa choir dans la vasque
d’argent.
Vraiment, la sensation qu’elle éprouvait était prodigieuse. Comme
elle avait été sotte, habituée à l’action bienfaisante du bain matinal,
d’avoir, par un sentiment de prudence que, dans son actuelle
béatitude, elle jugeait excessif, dédaigné l’accueil enchanteur de la
salle des Hespérides ! Et soudain, elle eut comme une hallucination…
Un cri s’étouffa dans sa gorge…
Les oranges de chaque arbre, versant le flot doré de leur lumière,
s’étaient subitement éclairées, et, sur un coup de timbre, le panneau
du milieu, au pied duquel couraient des azalées, s’écartait
brusquement…
Il donnait sur un petit salon, meublé à l’orientale où, parmi
l’encombrement des coussins, un être, enfoui sous un domino noir,
et strictement masqué, scrutait — avec quel regard ! — la statue de
la Peur que, symbole vivant, Françoise de Targes représentait,
ruisselante, échevelée, hagarde…
Car, à côté de cette forme noire, Técla Dortnoff, un fouet à la
main, se dressait, cynique, dans le triomphe de son abominable
menace.
Le premier instant de stupeur passé, Françoise bondit, d’un trait,
sur ses effets et se précipita vers la porte qui lui avait livré passage.
Elle était close !…
Trop tard, la prisonnière comprenait qu’elle avait été jouée et
qu’on avait eu impudemment raison de la prudence dont elle s’était
un instant départie. L’eau qu’elle avait bue à son repas contenait un
aphrodisiaque…
Blottie dans l’angle de cette porte, serrant contre ses seins, afin
de masquer sa nudité, la robe qu’elle avait cueillie au vol, elle la
palpait dans l’espoir d’y retrouver le couteau dont elle ne se séparait
jamais. Hélas ! Elle l’aperçut qui, sur la pourpre laineuse du tapis,
luisait, abandonné… à dix pas d’elle !
Et Técla, sortant du cadre, s’avançait vers elle, dominatrice et
gouailleuse :
— Ah ! Ah !… Nous allons t’apprivoiser, rebelle ! Trop longtemps,
tu as joué avec la patience, je crois !… Allons, il faut lâcher cette
robe. Il faut que tu sois comme Dieu notre Père t’a faite. —
Bénédiction ! — avec le seul vêtement de ta tignasse rousse !…
Un coup de fouet cinglait les doigts de Françoise, qui, sous la
douleur, et pensant devenir folle de honte, lâcha prise…
L’autre faisait, à petits coups secs, courir le claquement du
serpent de cuir sur les jambes fuselées de cette nouvelle martyre.
Ce n’était pas la souffrance qui tenaillait le plus la malheureuse,
ce n’était pas l’effroi que lui inspirait son bourreau, à visage de
Gorgone, c’était la vision de ce spectre noir, enseveli, comme une
araignée tissant sa toile, dans l’ombre des étoffes et qui, à présent,
se tenait debout, très grand, les yeux étincelants sous le velours du
masque.
Un tremblement léger semblait le faire frissonner, Cet hallucinant
fantôme de carnaval, et lentement, lentement, il s’approchait des
deux femmes en balbutiant d’une voix étranglée :
— Assez ! Assez !…
Mais la Dortnoff négligeait de l’entendre. De sa forte main, elle
avait emprisonné les dix doigts de Françoise et elle hurlait :
— Tu connaîtras l’amour… — chèvre mauvaise ! — mais avant, tu
auras le fouet ! Lequel tu préfères, dis ?…
Et, de sa main libre, elle frappait la chair neigeuse, où des
striures pourprées marquaient les coups :
— Lequel tu préfères, entêtée maudite ? de l’amour ou bien du
knout ?…
— Assez !… suppliait à voix plus haute la forme noire.
— Je préfère la mort ! cria Françoise qui, crachant au visage de
son bourreau, se dégageait de son étreinte d’un effort désespéré et
roulait sur le tapis où le couteau d’argent était resté. Elle
l’empoigna… C’était le salut !
Elle n’avait plus de pudeur, préoccupée de sa seule vengeance…
L’atroce humiliation du châtiment subi, la morsure sacrilège qui avait
brûlé son corps, l’aveuglaient de larmes, la possédaient d’une rage
de crime… Tragique, elle clama, levant son arme justicière :
— Le premier d’entre vous qui m’approche, je le tue !…
On frappait à la porte contre laquelle Françoise s’était tout à
l’heure inutilement heurtée, tandis qu’au dehors la voix d’Ardessy
appelait :
— Prince ! Prince !… Puis-je ouvrir ?…
Le Prince !… Ce fantôme masqué, c’était donc lui ! Lui qui, après
l’avoir enlevée, séquestrée, depuis des semaines, avait toléré
l’infamie de la livrer au fouet de la Dortnoff, lui qui, de sa cachette,
avait violé, de son regard de vice, les moindres détails de sa
féminine beauté, lui !…
Françoise de Targes, la délicate poétesse, la mondaine souriante
et calme, la Fleur-de-France de Felsburg, n’avaient, à coup sûr, rien
de commun avec cette nudité farouche, à la crinière croulante qui,
tout à coup, se ruait sur le domino noir, et lui enfonçait jusqu’à la
garde le couteau d’argent ramassé sur la pourpre du tapis.
Il s’affaissa, sans un cri, pendant que la Dortnoff poussait des
hurlements désespérés effroyables.
— Ouvre, disait-elle à Ardessy. Ouvre donc !… Elle va me tuer
aussi, cette gueuse !
Ardessy se précipitait vers la masse effondrée, rabattait le
capuchon de soie, déchirait le masque… Hugo portait les mains à
son ventre… Il articulait avec peine :
— Laissez-la ! Ne lui faites pas de mal… Ce n’est rien. Prends
l’auto, Ardessy, et cours chercher un médecin à Feldenritz… Aide-moi
seulement à gagner ma chambre… Mais ne lui faites rien, n’est-ce
pas ? Je vous en supplie. Laissez-la !…
*
* *

Le trio avait disparu…


Françoise entendait leurs pas s’éloigner peu à peu. Elle avait
comme conscience de l’avoir tué, cet homme, et chose affreuse,
hébétée, tremblante, secouée de frissons convulsifs, elle n’en
éprouvait aucun regret, aucun remords…
Machinalement, elle ramassait ses vêtements épars, piétinés
dans la lutte, et regagnait sa chambre où, avec des mouvements
désordonnés de folle, en hâte, elle se rhabillait.
Un bruit de pas sur le gravier, une galopade dans l’escalier :
c’était Marina, qu’Augustus, sur un ordre donné, venait de relâcher
et qui, échevelée, haletante, rejoignait sa maîtresse.
— Le comte Ardessy part en auto, Signorina. Il va chercher un
médecin. Le Prince s’est blessé, paraît-il… Augustus, ah ! le
misérable !… m’a enfermée dans sa cave… Si vous saviez !… J’ai
entendu, oui, j’ai entendu le maître d’hôtel et lui qui causaient. Il y a
la guerre. On mobilise !
La prédiction de l’Archiduchesse se réalisait.
— Signorina ! continuait l’Italienne. Je connais le moyen de vous
sauver. J’ai vu la clef du portail. Je sais où elle est. Je l’ai vue !…
Devant Augustus, à sa droite… Cette clef !… J’en ai rêvé tantôt dans
cette cave où l’on m’a jetée, demi-morte de peur, après m’avoir… Je
n’ose pas vous dire !… Les souffrances endurées, la rage ressentie ne
m’ont pas ôté l’usage de l’esprit. J’ai réfléchi et je garde le
pressentiment, croyez-en votre pauvre servante, plus misérable
encore que vous ne pensez, que bientôt, grâce à moi, vous sortirez
d’ici. Ayez confiance ! Ah ! ce que j’ai subi pendant ces quelques
heures n’est rien, rien, si vous y trouvez la liberté !…
Mlle de Targes regarda plus attentivement l’Italienne. La cernure
profonde qui bistrait ses yeux, la sueur qui perlait à ses tempes, les
éraflures de son maigre visage aux cheveux collés, la brûlure de son
haleine, révélaient qu’elle aussi avait eu à se défendre, à lutter
comme une brave petite bête sauvage, désespérément.
Quel supplice avait-on imaginé pour celle-là ?…
En quelques mots haletants, l’enfant la renseigna. C’était
monstrueux…
Augustus, la voyant passer, l’avait hélée avec, — ô surprise !… un
joyeux sourire. Lui, si peu bavard d’ordinaire, s’était montré tout à
coup prolixe, faisant assaut d’amabilités. La Triestine, stupéfaite,
s’était, une minute, bercée de l’espoir qu’un renseignement
quelconque s’échapperait de cette conversation. Elle avait avancé le
nez, inspectant avec curiosité l’intérieur de la maisonnette.
De plus en plus engageant, le hideux bonhomme l’avait invitée à
compléter son inspection. Sans défiance, elle était entrée… Alors,
fermant la porte, il avait abattu sur la proie guettée, sur la proie
enfin permise, ses pattes de géant… Maigre les ruades et les
sursauts désespérés de la fillette, il tâtait ce corps gracile, écrasant
sous ses doigts lourds le fruit menu des seins trop jeunes qu’il
cherchait à faire jaillir du corsage arraché… Elle s’était défendue
vaillamment, la pauvre fille, mais lui, bravant les morsures et les
coups d’ongle, lui avait ligoté les pieds, puis les mains. Enfin, il l’avait
bâillonnée de son mouchoir sale. Puis, cela avait été innommable… Il
s’était baissé, relevant les jupes de la malheureuse, lui faisant subir
l’odieux supplice de ses baisers immondes… Il n’avait lâché le triste
corps soubresautant que lorsque son caprice abject eut été satisfait.
Et, traînant par les cheveux cette forme humaine, loque souillée de
sa bave de brute, il avait ouvert la trappe de sa cave et le corps de
l’enfant, dégringolant les marches, tombait sur un tas de charbon, la
tête la première… Elle aurait pu, sur le coup, être tuée…
Elle était demeurée là, pantelante, durant des heures… Par le
soupirail, elle avait entendu les propos échangés entre son bourreau
et la valetaille. Enfin, Augustus était venu l’empoigner à nouveau,
puis l’ayant remontée dans sa loge et délivrée de ses liens, il avait
souligné, d’un geste bien tudesque, toutes les tortures endurées par
sa victime, en lui octroyant, marque du plus insultant mépris, un
large coup de pied dans le derrière…
Elle s’était enfuie vers sa maîtresse. Maintenant, sanglotante, elle
était abattue à ses pieds. Françoise l’avait écoutée, frémissante. Ce
que Marina venait de souffrir, le guet-apens du bain dont elle avait
failli être elle-même victime, la morsure, cuisante encore, du fouet
de la Dortnoff, l’emplissaient d’une terreur folle en même temps que
d’une haine farouche. Sa torpeur était passée. Une pitié profonde
envers la Triestine la faisait se pencher sur cette fragilité plus blessée
qu’elle…
La sauvageonne s’était tue, la regardant avec une ferveur
extasiée, joignant les mains, se sentant comme protégée par la plus
forte, par la plus grande.
Émue, Françoise avait pris le front de la fillette entre ses doigts
et, avec une infinie tendresse, y déposait un baiser. Humides de
larmes, les yeux de l’Italienne rayonnèrent. Elle murmura :
— Par la Madone, Signorina, pour vous, je sacrifierais ma vie !
Venu du lointain, un bruit leur parvenait, confus, croissant… Elles
percevaient distinctement l’aigre bruit du fifre et le sourd
grondement que font les troupes en marche…
Une immense tristesse envahissait le cœur des jeunes filles. Le
soir tomba. Nul bruit. Elles n’entendirent pas Ardessy rentrer. Le rez-
de-chaussée était plongé dans le silence.
Solennel, le maître d’hôtel vint, comme de coutume, prendre les
ordres. Mlle de Targes n’accepta rien.
Vers dix heures, pendant que Françoise était plongée dans une
morne méditation, la Triestine demanda :
— Avez-vous de l’or, Signorina ?
Oui, elle possédait environ quinze mille francs sur elle. Toutes ses
économies amassées durant dix-sept mois de servage : un chèque
de dix mille francs, le reste en billets de banque et en une trentaine
de doubles-couronnes d’or.
— Mettez cela dans votre sac. Prenez votre chapeau. Tenez-vous
prête. Suivez-moi. Ne faites aucun bruit !
Avant d’ouvrir la porte sur le grand escalier, l’Italienne murmura :
— Nous ne pourrons jamais nous sauver toutes deux… N’ayez
pas peur et, voulez-vous, Signorina ? embrassez-moi une fois encore,
la dernière… Dieu, qui est juste, s’il n’est pas avec moi, sera avec
vous !
Les deux femmes se glissèrent dans le parc ; la demie de dix
heures sonnait. Elles atteignaient, en silence, la maison du portier où
elles aperçurent, formidable cerbère aux poings géants, gardant
fidèlement la grille d’entrée, l’ignoble Augustus, ronflant sur sa
chaise…
— Tenez-vous près de la grille, souffla la Triestine. Quelque bruit
que vous puissiez entendre, dès que vous aurez la clef du portail,
ramassez-la. Ouvrez et, sans vous soucier de moi, partez !… Partez
sans vous retourner, sans un regard, sans un mot !… Adio,
Signorina !…
Elles s’étreignaient…
Précautionneusement, elle ouvrit la porte de la loge.
Sur la table où il dormait, devant les pattes velues du monstre,
s’étalait la clef libératrice… Nouveau David, la frêle fille de Trieste se
mesurait avec Goliath endormi…
. . . . . . . . . . . . . . . . . . . .
Tout le reste n’était qu’un autre rêve affreux, un autre rêve
atroce, vécu par Françoise de Targes.
Une clef, jetée sur le sable et ramassée, avec la rapidité de
l’éclair, par la fugitive, laissant, toute grande ouverte, la lourde porte
de fer aux grilles dorées… Le bruit d’une lutte… Un coup de feu…
Des clameurs dans la nuit… Une course de bête traquée à travers
bois, à travers champs… Le hasard d’une voiture de laitier
rencontrée à l’aube et qui, moyennant dix marks, la conduisait,
échevelée, rompue, à une gare encombrée de soldats allemands,
appelés sous les drapeaux par la mobilisation, pour le triomphe de la
« Kultur », voilà ce que Françoise, les tempes bourdonnantes, le
corps brisé, le cœur prêt à sauter et le cerveau en délire, revoyait
dans le compartiment de première qui l’emportait vers la Suisse,
dans l’infernal supplice d’un cauchemar épouvantable, d’un
cauchemar sans nom, d’un cauchemar sans fin !…
Et, là-bas, auprès de la lourde porte de fer aux rosaces
compliquées, dans la loge du cerbère Augustus, devant les nègres
atterrés et stupides, gisait, un trou sanglant au milieu du front le
frêle petit cadavre de Marina, la Triestine, qui, courageusement,
avait fait le sublime sacrifice de sa vie pour sauver Françoise, parce
que celle-ci, dans sa douceur, dans son humaine tendresse, lui avait
révélé ce qu’il y a de plus magnifique au monde : la Bonté !…
X
Et puis, il y eut la guerre…

— Je t’ai admirée en robe de soirée, de visite et d’intérieur, en


maillot de bain, et même en chemise de nuit, mais jamais, non
jamais, je ne t’ai vue aussi belle, aussi chic, aussi réussie, aussi
« chef-d’œuvre » enfin ! que sous ce costume-là !…
C’est Mlle Corbier qui, volubile, parle ainsi.
Son éternel monocle à l’œil, elle inspecte dans le hall de la rue
Desbordes-Valmore, où Jacques Provence a réuni tant d’œuvres
d’art, sa Françoise qui se tient devant elle, vêtue du fourreau blanc
des infirmières, drapée dans l’ample manteau bleu, sa jolie tête
grave, aux yeux tristes, serrée sous le bandeau où saigne la pourpre
d’une toute petite croix…
Il y a six mois qu’elle est de retour, cette vaillante Françoise.
Comme un oiseau blessé qui, tirant de l’aile, revient au nid, elle s’est
abattue quai Voltaire, un soir d’août, brisée par plusieurs nuits de
voyage et par les émotions les plus effroyables.
Il fallait voir la fureur d’une Moune écumante montrant les poings
à cette saleté d’Archiduchesse, à sa clique d’ivrognes, de bourreaux,
d’empoisonneurs et de pervertis ; à ce Prince — un satyre qui n’avait
rien inventé en comparant sa nièce à un lis ! — à cette Dortnoff, qui
méritait d’être pétrolée, puis grillée vive, et à ce comte Ardessy, —
une ordure doublée d’une fripouille !
— Plus fripouille encore que mon notaire ! On l’a arrêté, tu sais,
mignonne ? Cette canaille n’avait englouti que trois millions à sa
clientèle ! C’est un rien, un souffle, un rien… comme fredonnait Rip.
Une paille ! Nous sommes, pour notre compte, allégés de trois cent
cinquante billets de mille. De quoi faire à la notairesse des papillotes
de luxe pour la nuit.
Depuis lors, Marie-Antoinette Corbier ressasse chaque jour, le
même chapelet de malédictions et d’injures plus ou moins variées,
mais parfois sonore, un rire s’échappe de ses fortes lèvres.
— Comme tu es heureuse de pouvoir rire encore, ma Moune !
constate sa nièce.
— Où est le temps, par contre, où, toi, tu riais de tout ? Où tu me
sortais des aphorismes à la Sainte-Thérèse et à la Spinoza ? Il faut
que ce soit moi maintenant, moi, la grosse ronchon, qui fasse le
pantin pour t’arracher un sourire. Ah ! ma Reine jolie, t’avoir là, te
cajoler, t’embrasser ! Quelle joie ! Quoi qu’on dise, va, il y a, malgré
tout, un peu de bonheur pour les braves gens…
— Tu trouves ?… Il y a tant de braves gens qui meurent sur le
front, à chaque heure qui passe !
— A mon âge, on est égoïste. C’est nous les braves gens. Ceux
dont tu parles sont des gens braves.
— Évidemment… Tu finiras par trouver que ton notaire est la
crème des hommes. Puisqu’il est encore en prison, tu devrais songer
à lui envoyer quelques douceurs.
— Pour quoi faire ?
— Pour lui exprimer ta satisfaction de le savoir à l’abri des balles,
pendant que sa clientèle se fait copieusement casser la figure.
— Il y a un progrès. Tu railles. Ton moral s’améliore. Bientôt tu
riras.
Françoise secoue lentement la tête.
— Non, Mounette, non ; je ne rirai plus, tant qu’il y aura la
guerre.

You might also like