100% found this document useful (3 votes)
25 views

Download ebooks file (Ebook) Pro ASP.NET Core MVC: Develop cloud-ready web applications using Microsoft’s latest framework, ASP.NET Core MVC — Sixth Edition by Adam Freeman ISBN 9781484203972, 9781484203989, 1484203976, 1484203984 all chapters

The document provides information about various eBooks related to ASP.NET Core MVC authored by Adam Freeman, including their titles, editions, and ISBNs. It includes links to download these eBooks in multiple formats such as PDF, ePub, and MOBI. Additionally, it outlines the contents of the 'Pro ASP.NET Core MVC: Sixth Edition' book, detailing its structure and chapters.

Uploaded by

amackelorasn
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (3 votes)
25 views

Download ebooks file (Ebook) Pro ASP.NET Core MVC: Develop cloud-ready web applications using Microsoft’s latest framework, ASP.NET Core MVC — Sixth Edition by Adam Freeman ISBN 9781484203972, 9781484203989, 1484203976, 1484203984 all chapters

The document provides information about various eBooks related to ASP.NET Core MVC authored by Adam Freeman, including their titles, editions, and ISBNs. It includes links to download these eBooks in multiple formats such as PDF, ePub, and MOBI. Additionally, it outlines the contents of the 'Pro ASP.NET Core MVC: Sixth Edition' book, detailing its structure and chapters.

Uploaded by

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

Download the Full Ebook and Access More Features - ebooknice.

com

(Ebook) Pro ASP.NET Core MVC: Develop cloud-ready


web applications using Microsoft’s latest
framework, ASP.NET Core MVC — Sixth Edition by
Adam Freeman ISBN 9781484203972, 9781484203989,
1484203976, 1484203984
https://ebooknice.com/product/pro-asp-net-core-mvc-develop-
cloud-ready-web-applications-using-microsofts-latest-
framework-asp-net-core-mvc-sixth-edition-5604292

OR CLICK HERE

DOWLOAD EBOOK

Download more ebook instantly today at https://ebooknice.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!

(Ebook) Pro ASP.NET Core MVC 2: Develop cloud-ready web applications using
Microsoft’s latest framework, ASP.NET Core MVC 2 — Seventh Edition by Adam Freeman
ISBN 9781484231494, 9781484231500, 148423149X, 1484231503

https://ebooknice.com/product/pro-asp-net-core-mvc-2-develop-cloud-ready-web-
applications-using-microsofts-latest-framework-asp-net-core-mvc-2-seventh-
edition-6788082

ebooknice.com

(Ebook) Pro ASP.NET Core 6: Develop Cloud-Ready Web Applications Using MVC, Blazor,
and Razor Pages by Adam Freeman ISBN 9781484279564, 1484279565

https://ebooknice.com/product/pro-asp-net-core-6-develop-cloud-ready-web-
applications-using-mvc-blazor-and-razor-pages-38495700

ebooknice.com

(Ebook) Pro ASP.NET Core 3: Develop Cloud-Ready Web Applications Using MVC, Blazor,
and Razor Pages — Eighth Edition by Adam Freeman ISBN 9781484254400, 1484254406

https://ebooknice.com/product/pro-asp-net-core-3-develop-cloud-ready-web-
applications-using-mvc-blazor-and-razor-pages-eighth-edition-11127922

ebooknice.com

(Ebook) Pro ASP.NET Core 6: Develop Cloud-Ready Web Applications Using MVC, Blazor,
and Razor Pages by Adam Freeman ISBN 9781484279564, 9781484279571, 1484279565,
1484279573

https://ebooknice.com/product/pro-asp-net-core-6-develop-cloud-ready-web-
applications-using-mvc-blazor-and-razor-pages-42831304

ebooknice.com
(Ebook) Pro Entity Framework Core 2 for ASP.NET Core MVC by Adam Freeman ISBN
9781484234341, 1484234340

https://ebooknice.com/product/pro-entity-framework-core-2-for-asp-net-core-
mvc-7008222

ebooknice.com

(Ebook) Pro Entity Framework Core 2 for ASP.NET Core MVC by Adam Freeman ISBN
9781484234358, 1484234359

https://ebooknice.com/product/pro-entity-framework-core-2-for-asp-net-core-
mvc-51057654

ebooknice.com

(Ebook) Pro ASP.NET MVC 3 Framework, 3rd Edition by Steven Sanderson, Adam Freeman
ISBN 9781430234043, 1430234040

https://ebooknice.com/product/pro-asp-net-mvc-3-framework-3rd-edition-5473394

ebooknice.com

(Ebook) Essential Angular for ASP.NET Core MVC by Adam Freeman ISBN 9781484229156,
1484229150, B0749HQCWQ

https://ebooknice.com/product/essential-angular-for-asp-net-core-mvc-44425720

ebooknice.com

(Ebook) Essential Angular for ASP.NET Core MVC 3 by Adam Freeman ISBN 9781484252833,
1484252837

https://ebooknice.com/product/essential-angular-for-asp-net-core-mvc-3-10556580

ebooknice.com
Pro ASP.NET
Core MVC
Develop cloud-ready web applications
using Microsoft’s latest framework,
ASP.NET Core MVC

Sixth Edition

Adam Freeman
Pro ASP.NET Core MVC
Sixth Edition

Adam Freeman
Pro ASP.NET Core MVC: Sixth Edition

Adam Freeman
ISBN-13 (pbk): 978-1-4842-0398-9 ISBN-13 (electronic): 978-1-4842-0397-2
DOI 10.1007/978-1-4842-0397-2
Library of Congress Control Number: 2016953186
Copyright © 2016 by Adam Freeman
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: Welmoed Spahr
Lead Editor: Gwenan Spearing
Technical Reviewer: Fabio Claudio Ferracchiati
Editorial Board: Steve Anglin, Pramila Balan, Laura Berendson, Aaron Black, Louise Corrigan,
Jonathan Gennick, Robert Hutchinson, Celestin Suresh John, Nikhil Karkal, James Markham,
Susan McDermott, Matthew Moodie, Natalie Pao, Gwenan Spearing
Coordinating Editor: Mark Powers
Copy Editor: Kim Wimpsett
Compositor: SPi Global
Indexer: SPi Global
Artist: SPi Global
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 www.apress.com.
Apress and friends of ED books 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 Special
Bulk Sales–eBook Licensing web page at www.apress.com/bulk-sales.
Any source code or other supplementary materials referenced by the author in this text are available to
readers at www.apress.com/9781484203989. For detailed information about how to locate your book’s source
code, go to www.apress.com/source-code/. Readers can also access source code at SpringerLink in the
Supplementary Material section for each chapter.
Printed on acid-free paper
Dedicated to my lovely wife, Jacqui Griffyth (and also to Peanut).
Contents at a Glance

About the Author .................................................................................................xxvii


About the Technical Reviewer ..............................................................................xxix

■Part I: Introducing ASP.NET Core MVC ................................................ 1


■Chapter 1: ASP.NET Core MVC in Context ............................................................... 3
■Chapter 2: Your First MVC Application ................................................................ 11
■Chapter 3: The MVC Pattern, Projects, and Conventions ..................................... 53
■Chapter 4: Essential C# Features......................................................................... 65
■Chapter 5: Working with Razor ......................................................................... 101
■Chapter 6: Working with Visual Studio .............................................................. 123
■Chapter 7: Unit Testing MVC Applications ......................................................... 159
■Chapter 8: SportsStore: A Real Application ....................................................... 191
■Chapter 9: SportsStore: Navigation ................................................................... 235
■Chapter 10: SportsStore: Completing the Cart .................................................. 269
■Chapter 11: SportsStore: Administration .......................................................... 291
■Chapter 12: SportsStore: Security and Deployment .......................................... 319
■Chapter 13: Working with Visual Studio Code ................................................... 343
■Part II: ASP.NET Core MVC in Detail ................................................ 371
■Chapter 14: Configuring Applications................................................................ 373
■Chapter 15: URL Routing.................................................................................... 425
■Chapter 16: Advanced Routing Features ........................................................... 465

v
■ CONTENTS AT A GLANCE

■Chapter 17: Controllers and Actions.................................................................. 503


■Chapter 18: Dependency Injection ..................................................................... 547
■Chapter 19: Filters ............................................................................................. 581
■Chapter 20: API Controllers ............................................................................... 621
■Chapter 21: Views ............................................................................................. 653
■Chapter 22: View Components .......................................................................... 687
■Chapter 23: Understanding Tag Helpers ............................................................ 719
■Chapter 24: Using the Form Tag Helpers ........................................................... 753
■Chapter 25: Using the Other Built-in Tag Helpers .............................................. 779
■Chapter 26: Model Binding ................................................................................ 805
■Chapter 27: Model Validation ............................................................................ 843
■Chapter 28: Getting Started with Identity .......................................................... 877
■Chapter 29: Applying ASP.NET Core Identity ...................................................... 919
■Chapter 30: Advanced ASP.NET Core Identity .................................................... 949
■Chapter 31: Model Conventions and Action Constraints ................................... 983

Index ................................................................................................................... 1013

vi
Contents

About the Author .................................................................................................xxvii


About the Technical Reviewer ..............................................................................xxix

■Part I: Introducing ASP.NET Core MVC ................................................................... 1


■Chapter 1: ASP.NET Core MVC in Context ............................................................... 3
Understanding the History of ASP.NET Core MVC ............................................................. 3
ASP.NET Web Forms................................................................................................................................ 3
The Original MVC Framework ................................................................................................................. 5

Understanding ASP.NET Core ............................................................................................ 5


Key Benefits of ASP.NET Core MVC ......................................................................................................... 6

What Do I Need to Know? ................................................................................................. 8


What Is the Structure of This Book? ................................................................................. 8
Part 1: Introducing ASP.NET Core MVC.................................................................................................... 8
Part 2: ASP.NET Core MVC in Detail......................................................................................................... 9
What’s New in This Edition? ............................................................................................. 9
Where Can I Get the Example Code? ................................................................................ 9
Summary .......................................................................................................................... 9
■Chapter 2: Your First MVC Application ................................................................ 11
Installing Visual Studio ................................................................................................... 11
Creating a New ASP.NET Core MVC Project .................................................................... 13
Adding the Controller ............................................................................................................................ 17
Understanding Routes .......................................................................................................................... 19

vii
■ CONTENTS

Rendering Web Pages .................................................................................................... 20


Creating and Rendering a View ............................................................................................................ 20
Adding Dynamic Output ........................................................................................................................ 23

Creating a Simple Data-Entry Application ...................................................................... 25


Setting the Scene ................................................................................................................................. 25
Designing a Data Model........................................................................................................................ 26
Creating a Second Action and a Strongly Typed View........................................................................... 27
Linking Action Methods ........................................................................................................................ 28
Building the Form ................................................................................................................................. 30
Receiving Form Data ............................................................................................................................ 31
Displaying the Responses..................................................................................................................... 36
Adding Validation .................................................................................................................................. 38
Styling the Content ............................................................................................................................... 45

Summary ........................................................................................................................ 51
■Chapter 3: The MVC Pattern, Projects, and Conventions ..................................... 53
The History of MVC ......................................................................................................... 53
Understanding the MVC Pattern ..................................................................................... 53
Understanding Models .......................................................................................................................... 54
Understanding Controllers .................................................................................................................... 54
Understanding Views ............................................................................................................................ 55
The ASP.NET Implementation of MVC ................................................................................................... 55

Comparing MVC to Other Patterns.................................................................................. 55


Understanding the Smart UI Pattern ..................................................................................................... 56
Understanding the Model-View Architecture ........................................................................................ 57
Understanding Classic Three-Tier Architectures .................................................................................. 57
Understanding Variations on MVC ........................................................................................................ 58

Understanding ASP.NET Core MVC Projects.................................................................... 59


Creating the Project .............................................................................................................................. 59
Understanding MVC Conventions ......................................................................................................... 62

Summary ........................................................................................................................ 64

viii
■ CONTENTS

■Chapter 4: Essential C# Features......................................................................... 65


Preparing the Example Project ....................................................................................... 65
Enabling ASP.NET Core MVC ................................................................................................................. 67
Creating the MVC Application Components .......................................................................................... 68

Using the Null Conditional Operator ............................................................................... 70


Chaining the Null Conditional Operator ................................................................................................ 71
Combining the Conditional and Coalescing Operators ......................................................................... 72
Using Automatically Implemented Properties ................................................................ 73
Using Auto-Implemented Property Initializers ...................................................................................... 74
Creating Read-Only Automatically Implemented Properties................................................................. 75

Using String Interpolation............................................................................................... 76


Using Object and Collection Initializers .......................................................................... 77
Using an Index Initializer ...................................................................................................................... 79

Using Extension Methods ............................................................................................... 80


Applying Extension Methods to an Interface ........................................................................................ 82
Creating Filtering Extension Methods ................................................................................................... 83

Using Lambda Expressions ............................................................................................ 85


Defining Functions ................................................................................................................................ 86
Using Lambda Expression Methods and Properties ............................................................................. 89

Using Type Inference and Anonymous Types .................................................................. 91


Using Anonymous Types ....................................................................................................................... 92

Using Asynchronous Methods ........................................................................................ 94


Working with Tasks Directly ................................................................................................................. 94
Applying the async and await Keywords .............................................................................................. 96

Getting Names ................................................................................................................ 97


Summary ........................................................................................................................ 99

ix
■ CONTENTS

■Chapter 5: Working with Razor ......................................................................... 101


Preparing the Example Project ..................................................................................... 102
Defining the Model ............................................................................................................................. 103
Creating the Controller ....................................................................................................................... 103
Creating the View ............................................................................................................................... 104

Working with the Model Object .................................................................................... 105


Using View Imports ............................................................................................................................. 107
Working with Layouts ................................................................................................... 109
Creating the Layout ............................................................................................................................ 109
Applying a Layout ............................................................................................................................... 111
Using a View Start File ........................................................................................................................ 112

Using Razor Expressions .............................................................................................. 114


Inserting Data Values .......................................................................................................................... 115
Setting Attribute Values ...................................................................................................................... 117
Using Conditional Statements ............................................................................................................ 118
Enumerating Arrays and Collections ................................................................................................... 120

Summary ...................................................................................................................... 122


■Chapter 6: Working with Visual Studio .............................................................. 123
Preparing the Example Project ..................................................................................... 123
Creating the Model ............................................................................................................................. 124
Creating the Controller and View ........................................................................................................ 126

Managing Software Packages ...................................................................................... 128


Understanding NuGet.......................................................................................................................... 128
Understanding Bower ......................................................................................................................... 130

Understanding Iterative Development .......................................................................... 134


Making Changes to Razor Views ........................................................................................................ 134
Making Changes to C# Classes .......................................................................................................... 136
Using Browser Link............................................................................................................................. 144

x
Visit https://ebooknice.com to
discover a wide range of
eBooks across various genres.
Enjoy exclusive deals and
discounts to enhance your
reading experience. Start your
digital reading journey today!
■ CONTENTS

Preparing JavaScript and CSS for Deployment ............................................................ 150


Enabling Static Content Delivery ........................................................................................................ 150
Adding Static Content to the Project................................................................................................... 151
Updating the View............................................................................................................................... 153
Bundling and Minifying in MVC Applications ...................................................................................... 154

Summary ...................................................................................................................... 158


■Chapter 7: Unit Testing MVC Applications ......................................................... 159
Preparing the Example Project ..................................................................................... 160
Enabling the Built-in Tag Helpers ....................................................................................................... 160
Adding Actions to the Controller ......................................................................................................... 160
Creating the Data Entry Form ............................................................................................................. 161
Updating the Index View ..................................................................................................................... 162

Unit Testing MVC Applications ...................................................................................... 163


Creating a Unit test Project ................................................................................................................. 164
Writing and Running Unit Tests........................................................................................................... 167
Isolating Components for Unit Testing ................................................................................................ 171

Improving Unit Tests ..................................................................................................... 179


Parameterizing a Unit Test .................................................................................................................. 179
Improving Fake Implementations ....................................................................................................... 183

Summary ...................................................................................................................... 189


■Chapter 8: SportsStore: A Real Application ....................................................... 191
Getting Started ............................................................................................................. 192
Creating the MVC Project .................................................................................................................... 192
Creating the Unit Test Project ............................................................................................................. 197
Checking and Running the Application ............................................................................................... 199

Starting the Domain Model........................................................................................... 200


Creating a Repository ......................................................................................................................... 200
Creating a Fake Repository ................................................................................................................ 201
Registering the Repository Service .................................................................................................... 201

xi
■ CONTENTS

Displaying a List of Products ........................................................................................ 202


Adding a Controller ............................................................................................................................. 204
Adding and Configuring the View ....................................................................................................... 205
Setting the Default Route ................................................................................................................... 207
Running the Application...................................................................................................................... 208

Preparing a Database ................................................................................................... 208


Installing Entity Framework Core ....................................................................................................... 209
Creating the Database Classes ........................................................................................................... 210
Creating the Repository Class ............................................................................................................ 212
Defining the Connection String ........................................................................................................... 212
Configuring the Application ................................................................................................................ 213
Creating and Applying the Database Migration .................................................................................. 215

Adding Pagination ........................................................................................................ 216


Displaying Page Links......................................................................................................................... 218
Improving the URLs ............................................................................................................................ 227

Styling the Content ....................................................................................................... 228


Installing the Bootstrap Package ........................................................................................................ 229
Applying Bootstrap Styles to the Layout ............................................................................................. 229
Creating a Partial View ....................................................................................................................... 232

Summary ...................................................................................................................... 234


■Chapter 9: SportsStore: Navigation ................................................................... 235
Adding Navigation Controls .......................................................................................... 235
Filtering the Product List .................................................................................................................... 235
Refining the URL Scheme ................................................................................................................... 239
Building a Category Navigation Menu ................................................................................................ 243
Correcting the Page Count .................................................................................................................. 251

Building the Shopping Cart........................................................................................... 253


Defining the Cart Model ...................................................................................................................... 254
Adding the Add to Cart Buttons .......................................................................................................... 258
Enabling Sessions .............................................................................................................................. 260

xii
■ CONTENTS

Implementing the Cart Controller ....................................................................................................... 261


Displaying the Contents of the Cart .................................................................................................... 264
Summary ...................................................................................................................... 267
■Chapter 10: SportsStore: Completing the Cart .................................................. 269
Refining the Cart Model with a Service ........................................................................ 269
Creating a Storage-Aware Cart Class ................................................................................................. 269
Registering the Service ...................................................................................................................... 270
Simplifying the Cart Controller ........................................................................................................... 271
Completing the Cart Functionality ................................................................................ 272
Removing Items from the Cart ............................................................................................................ 272
Adding the Cart Summary Widget ...................................................................................................... 274

Submitting Orders ........................................................................................................ 277


Creating the Model Class .................................................................................................................... 277
Adding the Checkout Process ............................................................................................................. 278
Implementing Order Processing ......................................................................................................... 282
Completing the Order Controller ......................................................................................................... 285
Displaying Validation Errors ................................................................................................................ 288
Displaying a Summary Page............................................................................................................... 290
Summary ...................................................................................................................... 290
■Chapter 11: SportsStore: Administration .......................................................... 291
Managing Orders .......................................................................................................... 291
Enhancing the Model .......................................................................................................................... 291
Adding the Actions and View .............................................................................................................. 292

Adding Catalog Management ....................................................................................... 295


Creating a CRUD Controller ................................................................................................................. 296
Implementing the List View ................................................................................................................ 298
Editing Products ................................................................................................................................. 299
Creating New Products ....................................................................................................................... 313
Deleting Products ............................................................................................................................... 315

Summary ...................................................................................................................... 318

xiii
■ CONTENTS

■Chapter 12: SportsStore: Security and Deployment .......................................... 319


Securing the Administration Features .......................................................................... 319
Adding the Identity Package to the Project ........................................................................................ 319
Creating the Identity Database ........................................................................................................... 320
Applying a Basic Authorization Policy ................................................................................................. 324
Creating the Account Controller and Views ........................................................................................ 326
Testing the Security Policy.................................................................................................................. 330
Deploying the Application ............................................................................................. 330
Creating the Databases ...................................................................................................................... 331
Preparing the Application ................................................................................................................... 332
Applying the Database Migrations ...................................................................................................... 337
Deploying the Application ................................................................................................................... 337

Summary ...................................................................................................................... 342


■Chapter 13: Working with Visual Studio Code ................................................... 343
Setting Up the Development Environment ................................................................... 343
Installing Node.js ................................................................................................................................ 343
Checking the Node Installation ........................................................................................................... 345
Installing Git........................................................................................................................................ 345
Checking the Git Installation ............................................................................................................... 345
Installing Yeoman, Bower, and Gulp .................................................................................................... 346
Installing .NET Core ............................................................................................................................ 346
Checking the .NET Core Installation ................................................................................................... 347
Installing Visual Studio Code .............................................................................................................. 348
Checking the Visual Studio Code Installation ..................................................................................... 348
Installing the Visual Studio Code C# Extension................................................................................... 349

Creating an ASP.NET Core Project ................................................................................ 350


Preparing the Project with Visual Studio Code ............................................................. 351
Adding NuGet Packages to the Project ............................................................................................... 352
Adding Client-Side Packages to the Project ....................................................................................... 353
Configuring the Application ................................................................................................................ 355
Building and Running the Project ....................................................................................................... 355

xiv
■ CONTENTS

Re-creating the PartyInvites Application ...................................................................... 356


Creating the Model and Repository .................................................................................................... 356
Creating the Database ........................................................................................................................ 359
Creating the Controllers and Views .................................................................................................... 361

Unit Testing in Visual Studio Code ................................................................................ 366


Configuring the Application ................................................................................................................ 366
Creating a Unit Test............................................................................................................................. 367
Running Tests ..................................................................................................................................... 368

Summary ...................................................................................................................... 369


■Part II: ASP.NET Core MVC in Detail ................................................ 371
■Chapter 14: Configuring Applications................................................................ 373
Preparing the Example Project ..................................................................................... 374
Understanding the JSON Configuration Files ............................................................... 376
Configuring the Solution ..................................................................................................................... 377
Configuring the Project ....................................................................................................................... 379

Understanding the Program Class................................................................................ 382


Understanding the Startup Class.................................................................................. 383
Understanding How the Startup Class Is Used ................................................................................... 385
Understanding ASP.NET Services........................................................................................................ 386
Understanding ASP.NET Middleware................................................................................................... 389
Understanding How the Configure Method Is Invoked ....................................................................... 398
Adding the Remaining Middleware Components................................................................................ 407
Using Configuration Data .................................................................................................................... 412

Configuring MVC Services ............................................................................................ 418


Dealing with Complex Configurations .......................................................................... 420
Creating Different External Configuration Files .................................................................................. 420
Creating Different Configuration Methods .......................................................................................... 421
Creating Different Configuration Classes............................................................................................ 422

Summary ...................................................................................................................... 424

xv
■ CONTENTS

■Chapter 15: URL Routing.................................................................................... 425


Preparing the Example Project ..................................................................................... 427
Creating the Model Class .................................................................................................................... 428
Creating the Example Controllers ....................................................................................................... 429
Creating the View ............................................................................................................................... 430

Introducing URL Patterns ............................................................................................. 431


Creating and Registering a Simple Route .................................................................... 433
Defining Default Values ................................................................................................ 434
Defining Inline Default Values ............................................................................................................. 435

Using Static URL Segments .......................................................................................... 437


Defining Custom Segment Variables ............................................................................ 442
Using Custom Variables as Action Method Parameters ...................................................................... 444
Defining Optional URL Segments ........................................................................................................ 446
Defining Variable-Length Routes ........................................................................................................ 448

Constraining Routes ..................................................................................................... 451


Constraining a Route Using a Regular Expression.............................................................................. 454
Using Type and Value Constraints ....................................................................................................... 455
Combining Constraints ....................................................................................................................... 456
Defining a Custom Constraint ............................................................................................................. 457

Using Attribute Routing ................................................................................................ 460


Preparing for Attribute Routing ........................................................................................................... 460
Applying Attribute Routing .................................................................................................................. 461
Applying Route Constraints ................................................................................................................ 464

Summary ...................................................................................................................... 464


■Chapter 16: Advanced Routing Features ........................................................... 465
Preparing the Example Project ..................................................................................... 466
Generating Outgoing URLs in Views ............................................................................. 468
Generating Outgoing Links ................................................................................................................. 468
Generating URLs (and Not Links) ........................................................................................................ 479

xvi
■ CONTENTS

Customizing the Routing System ................................................................................. 480


Changing the Routing System Configuration ...................................................................................... 481
Creating a Custom Route Class .......................................................................................................... 482

Working with Areas ...................................................................................................... 493


Creating an Area ................................................................................................................................. 493
Creating an Area Route ....................................................................................................................... 494
Populating an Area ............................................................................................................................. 495
Generating Links to Actions in Areas .................................................................................................. 497

URL Schema Best Practices ......................................................................................... 499


Make Your URLs Clean and Human-Friendly ...................................................................................... 499
GET and POST: Pick the Right One ...................................................................................................... 500

Summary ...................................................................................................................... 501


■Chapter 17: Controllers and Actions.................................................................. 503
Preparing the Example Project ..................................................................................... 504
Preparing the Views............................................................................................................................ 506

Understanding Controllers............................................................................................ 508


Creating Controllers ..................................................................................................... 508
Creating POCO Controllers .................................................................................................................. 508
Using the Controller Base Class ......................................................................................................... 511

Receiving Context Data ................................................................................................ 512


Getting Data from Context Objects ..................................................................................................... 512
Using Action Method Parameters ....................................................................................................... 517

Producing a Response.................................................................................................. 519


Producing a Response Using the Context Object................................................................................ 519
Understanding Action Results............................................................................................................. 520
Producing an HTML Response ............................................................................................................ 522
Performing Redirections ..................................................................................................................... 531
Returning Different Types of Content .................................................................................................. 538

xvii
■ CONTENTS

Responding with the Contents of Files ............................................................................................... 540


Returning Errors and HTTP Codes ...................................................................................................... 542
Understanding the Other Action Result Classes ................................................................................. 544
Summary ...................................................................................................................... 545
■Chapter 18: Dependency Injection ..................................................................... 547
Preparing the Example Project ..................................................................................... 548
Creating the Model and Repository .................................................................................................... 549
Creating the Controller and View ........................................................................................................ 551
Creating the Unit Test Project ............................................................................................................. 553
Creating Loosely Coupled Components ........................................................................ 554
Examining Closely Coupled Components............................................................................................ 554

Introducing ASP.NET Dependency Injection .................................................................. 561


Preparing for Dependency Injection ................................................................................................... 561
Configuring the Service Provider ........................................................................................................ 562
Unit Testing a Controller with a Dependency ...................................................................................... 564
Using Dependency Chains .................................................................................................................. 565
Using Dependency Injection for Concrete Types ................................................................................. 568
Understanding Service Life Cycles ............................................................................... 570
Using the Transient Life Cycle............................................................................................................. 570
Using the Scoped Life Cycle ............................................................................................................... 574
Using the Singleton Life Cycle ............................................................................................................ 576

Using Action Injection ................................................................................................... 577


Using the Property Injection Attributes......................................................................... 577
Manually Requesting an Implementation Object.......................................................... 578
Summary ...................................................................................................................... 579

xviii
■ CONTENTS

■Chapter 19: Filters ............................................................................................. 581


Preparing the Example Project ..................................................................................... 582
Enabling SSL....................................................................................................................................... 583
Creating the Controller and View ........................................................................................................ 584

Using Filters ................................................................................................................. 586


Understanding Filters ................................................................................................... 589
Getting Context Data ........................................................................................................................... 589
Using Authorization Filters ........................................................................................... 590
Creating an Authorization Filter .......................................................................................................... 591

Using Action Filters ...................................................................................................... 593


Creating an Action Filter ..................................................................................................................... 595
Creating an Asynchronous Action Filter .............................................................................................. 597

Using Result Filters ...................................................................................................... 598


Creating a Result Filter ....................................................................................................................... 599
Creating an Asynchronous Result Filter.............................................................................................. 600
Creating a Hybrid Action/Result Filter................................................................................................. 602

Using Exception Filters ................................................................................................. 604


Creating an Exception Filter ............................................................................................................... 605

Using Dependency Injection for Filters......................................................................... 607


Resolving Filter Dependencies ........................................................................................................... 607
Managing Filter Life Cycles ................................................................................................................ 611

Creating Global Filters .................................................................................................. 614


Understanding and Changing Filter Order .................................................................... 617
Changing Filter Order ......................................................................................................................... 619

Summary ...................................................................................................................... 620


■Chapter 20: API Controllers ............................................................................... 621
Preparing the Example Project ..................................................................................... 622
Creating the Model and Repository .................................................................................................... 622
Creating the Controller and Views ...................................................................................................... 624
Configuring the Application ................................................................................................................ 626

xix
■ CONTENTS

Understanding the Role of RESTful Controllers ............................................................ 628


Understanding the Speed Problem ..................................................................................................... 629
Understanding the Efficiency Problem ............................................................................................... 629
Understanding the Openness Problem ............................................................................................... 630

Introducing REST and API Controllers .......................................................................... 630


Creating an API Controller................................................................................................................... 631
Testing an API Controller..................................................................................................................... 635
Using the API Controller in the Browser.............................................................................................. 639

Understanding Content Formatting .............................................................................. 641


Understanding the Default Content Policy .......................................................................................... 642
Understanding Content Negotiation.................................................................................................... 643
Specifying an Action Data Format ...................................................................................................... 646
Getting the Data Format from the Route or Query String ................................................................... 647
Enabling Full Content Negotiation ...................................................................................................... 648
Receiving Different Data Formats....................................................................................................... 650

Summary ...................................................................................................................... 651


■Chapter 21: Views ............................................................................................. 653
Preparing the Example Project ..................................................................................... 654
Creating a Custom View Engine ................................................................................... 656
Creating a Custom IView .................................................................................................................... 657
Creating an IViewEngine Implementation ........................................................................................... 658
Registering a Custom View Engine ..................................................................................................... 659
Testing the View Engine...................................................................................................................... 660

Working with the Razor Engine .................................................................................... 663


Preparing the Example Project ........................................................................................................... 663
Demystifying Razor Views .................................................................................................................. 665

Adding Dynamic Content to a Razor View .................................................................... 669


Using Layout Sections ........................................................................................................................ 669
Using Partial Views ............................................................................................................................. 675
Adding JSON Content to Views ........................................................................................................... 678

xx
Visit https://ebooknice.com to
discover a wide range of
eBooks across various genres.
Enjoy exclusive deals and
discounts to enhance your
reading experience. Start your
digital reading journey today!
■ CONTENTS

Configuring Razor ......................................................................................................... 680


Understanding View Location Expanders ........................................................................................... 681

Summary ...................................................................................................................... 686


■Chapter 22: View Components .......................................................................... 687
Preparing the Example Project ..................................................................................... 688
Creating the Models and Repositories ................................................................................................ 689
Creating the Controller and Views ...................................................................................................... 691
Configuring the Application ................................................................................................................ 694

Understanding View Components ................................................................................ 695


Creating a View Component ......................................................................................... 696
Creating POCO View Components ....................................................................................................... 696
Deriving from the ViewComponent Base Class................................................................................... 698
Understanding View Component Results ............................................................................................ 699
Getting Context Data ........................................................................................................................... 705
Creating Asynchronous View Components ......................................................................................... 711

Creating Hybrid Controller/View Component Classes .................................................. 714


Creating the Hybrid Views .................................................................................................................. 715
Applying the Hybrid Class ................................................................................................................... 716

Summary ...................................................................................................................... 718


■Chapter 23: Understanding Tag Helpers ............................................................ 719
Preparing the Example Project ..................................................................................... 720
Creating the Model and Repository .................................................................................................... 721
Creating the Controller, Layout, and Views ......................................................................................... 722
Configuring the Application ................................................................................................................ 725

Creating a Tag Helper ................................................................................................... 726


Defining the Tag Helper Class ............................................................................................................. 726
Registering Tag Helpers ...................................................................................................................... 729
Using a Tag Helper .............................................................................................................................. 730
Managing the Scope of a Tag Helper .................................................................................................. 732

xxi
■ CONTENTS

Advanced Tag Helper Features ..................................................................................... 736


Creating Shorthand Elements ............................................................................................................. 736
Prepending and Appending Content and Elements ............................................................................ 739
Getting View Context Data and Using Dependency Injection .............................................................. 743
Working with the View Model ............................................................................................................. 745
Coordinating Between Tag Helpers..................................................................................................... 747
Suppressing the Output Element ........................................................................................................ 749
Summary ...................................................................................................................... 751
■Chapter 24: Using the Form Tag Helpers ........................................................... 753
Preparing the Example Project ..................................................................................... 754
Changing the Tag Helper Registration ................................................................................................ 754
Resetting the Views and Layout ......................................................................................................... 755

Working with Form Elements ....................................................................................... 757


Setting the Form Target ...................................................................................................................... 757
Using the Anti-forgery Feature ........................................................................................................... 758

Working with Input Elements ....................................................................................... 760


Configuring Input Elements ................................................................................................................ 761
Formatting Data Values ...................................................................................................................... 763

Working with Label Elements ....................................................................................... 766


Working with Select and Option Elements ................................................................... 768
Using a Data Source to Populate a select Element............................................................................. 770
Generating Option Elements from an enum........................................................................................ 770

Working with Text Areas ............................................................................................... 775


Understanding the Validation Form Tag Helpers .......................................................... 777
Summary ...................................................................................................................... 777

xxii
■ CONTENTS

■Chapter 25: Using the Other Built-in Tag Helpers .............................................. 779
Preparing the Example Project ..................................................................................... 780
Using the Hosting Environment Tag Helper .................................................................. 781
Using the JavaScript and CSS Tag Helpers .................................................................. 782
Managing JavaScript Files ................................................................................................................. 782
Managing CSS Stylesheets ................................................................................................................. 791

Working with Anchor Elements .................................................................................... 794


Working with Image Elements ..................................................................................... 795
Using the Data Cache ................................................................................................... 796
Setting Cache Expiry .......................................................................................................................... 799
Using Cache Variations ....................................................................................................................... 800

Using Application-Relative URLs .................................................................................. 801


Summary ...................................................................................................................... 804
■Chapter 26: Model Binding ................................................................................ 805
Preparing the Example Project ..................................................................................... 806
Creating the Model and Repository .................................................................................................... 807
Creating the Controller and View ........................................................................................................ 808
Configuring the Application ................................................................................................................ 810

Understanding Model Binding ...................................................................................... 811


Understanding Default Binding Values ............................................................................................... 813
Binding Simple Types ......................................................................................................................... 815
Binding Complex Types ....................................................................................................................... 816
Binding to Arrays and Collections ....................................................................................................... 827

Specifying a Model Binding Source.............................................................................. 834


Selecting a Standard Binding Source ................................................................................................. 835
Using Headers As Binding Sources..................................................................................................... 836
Using Request Bodies as Binding Sources ......................................................................................... 839
Summary ...................................................................................................................... 842

xxiii
■ CONTENTS

■Chapter 27: Model Validation ............................................................................ 843


Preparing the Example Project ..................................................................................... 844
Creating the Model ............................................................................................................................. 846
Creating the Controller ....................................................................................................................... 846
Creating the Layout and Views ........................................................................................................... 847

Understanding the Need for Model Validation .............................................................. 849


Explicitly Validating a Model ......................................................................................... 850
Displaying Validation Errors to the User ............................................................................................. 852
Displaying Validation Messages ......................................................................................................... 855
Displaying Property-Level Validation Messages ................................................................................. 859
Displaying Model-Level Messages ..................................................................................................... 861

Specifying Validation Rules Using Metadata ................................................................ 864


Creating a Custom Property Validation Attribute ................................................................................ 868

Performing Client-Side Validation ................................................................................ 870


Performing Remote Validation ...................................................................................... 872
Summary ...................................................................................................................... 876
■Chapter 28: Getting Started with Identity .......................................................... 877
Preparing the Example Project ..................................................................................... 878
Creating the Controller and View ........................................................................................................ 880

Setting Up ASP.NET Core Identity.................................................................................. 882


Adding the Identity Package to the Application .................................................................................. 882
Creating the User Class ...................................................................................................................... 883
Creating the Database Context Class ................................................................................................. 885
Configuring the Database Connection String Setting ......................................................................... 885
Configuring the Identity Services and Middleware ............................................................................. 887
Creating the Identity Database ........................................................................................................... 888

xxiv
■ CONTENTS

Using ASP.NET Core Identity ......................................................................................... 889


Enumerating User Accounts ............................................................................................................... 889
Creating Users .................................................................................................................................... 892
Validating Passwords ......................................................................................................................... 896
Validating User Details........................................................................................................................ 904

Completing the Administration Features ...................................................................... 910


Implementing the Delete Feature ....................................................................................................... 911
Implementing the Edit Feature ........................................................................................................... 912

Summary ...................................................................................................................... 917


■Chapter 29: Applying ASP.NET Core Identity ...................................................... 919
Preparing the Example Project ..................................................................................... 919
Authenticating Users .................................................................................................... 920
Preparing to Implement Authentication .............................................................................................. 923
Adding User Authentication ................................................................................................................ 926
Testing Authentication ........................................................................................................................ 928

Authorizing Users with Roles ....................................................................................... 929


Creating and Deleting Roles ............................................................................................................... 930
Managing Role Memberships ............................................................................................................. 935
Using Roles for Authorization ............................................................................................................. 941

Seeding the Database .................................................................................................. 945


Summary ...................................................................................................................... 948
■Chapter 30: Advanced ASP.NET Core Identity .................................................... 949
Preparing the Example Project ..................................................................................... 949
Adding Custom User Properties ................................................................................... 951
Preparing for Database Migration ...................................................................................................... 954
Testing the Custom Properties............................................................................................................ 955

Working with Claims and Policies ................................................................................ 956


Understanding Claims ........................................................................................................................ 956
Creating Claims .................................................................................................................................. 961

xxv
■ CONTENTS

Using Policies ..................................................................................................................................... 964


Using Policies to Authorize Access to Resources ............................................................................... 970
Using Third-Party Authentication.................................................................................. 976
Registering the Application with Google ............................................................................................. 976
Enabling Google Authentication .......................................................................................................... 977

Summary ...................................................................................................................... 982


■Chapter 31: Model Conventions and Action Constraints ................................... 983
Preparing the Example Project ..................................................................................... 983
Creating the View Model, Controller, and View ................................................................................... 985

Using the Application Model and Model Conventions .................................................. 987


Understanding the Application Model ................................................................................................. 988
Understanding the Role of Model Conventions................................................................................... 992
Creating a Model Convention.............................................................................................................. 993
Understanding Model Convention Execution Order ............................................................................ 998
Creating Global Model Conventions .................................................................................................... 999
Using Action Constraints ............................................................................................ 1001
Preparing the Example Project ......................................................................................................... 1001
Understanding Action Constraints .................................................................................................... 1003
Creating an Action Constraint ........................................................................................................... 1004
Resolving Dependencies in Action Constraints................................................................................. 1009

Summary .................................................................................................................... 1012

Index ................................................................................................................... 1013

xxvi
About the Author

Adam Freeman is an experienced IT professional who has held senior positions in a range of companies,
most recently serving as chief technology officer and chief operating officer of a global bank. Now retired, he
spends his time writing and long-distance running.

xxvii
About the Technical Reviewer

Fabio Claudio Ferracchiati is a senior consultant and a senior analyst/developer using Microsoft
technologies. He works for Brain Force (www.bluarancio.com). He is a Microsoft Certified Solution
Developer for .NET, a Microsoft Certified Application Developer for .NET, a Microsoft Certified Professional,
and a prolific author and technical reviewer. Over the past ten years, he’s written articles for Italian and
international magazines and coauthored more than ten books on a variety of computer topics.

xxix
PART I

Introducing ASP.NET Core MVC

ASP.NET Core MVC is a radical shift for web developers using the Microsoft platform. It emphasizes
clean architecture, design patterns, and testability, and it doesn’t try to conceal how the Web works.
The first part of this book is designed to help you understand broadly the foundational ideas of
MVC development, including the new features in ASP.NET Core MVC, and to experience in practice
what the framework is like to use.
Exploring the Variety of Random
Documents with Different Content
Ja äkkiä sai joukko hajaantua, kun julmannäköinen mies, takki
leukaa myöden napitettuna, miekka sivullaan ja kannukset jalassa
helisten, astui ylös portaita. Hänen poskensa olivat punaiset ja
pulleat juomisesta, hänen silmänsä tylsät ja villit kuin petoeläimen.
Syntyi täydellinen hiljaisuus ja kaikki tekivät kalpeina tietä
leppymättömälle Henriotille. Tuskin oli tämä karkea ja raudankova
tyrannin apulainen astua kaapaissut joukon läpi, kun taas
tungoksessa hätäisesti ja pelokkaasti annettiin tietä, sillä sisään
liukui äänettömänä kuin varjo eräs hymyilevä, siivonaamainen
kansalainen, yksinkertaisesti mutta sirosti puettu, silmät nöyrästi
maahan luotuina. Lempeämpiä, lauhkeampia kasvoja ei mikään
paimenrunoilija olisi voinut kuvata itse Thyrsikselle — ja miksi
kuitenkin väki henkeään pidättäen teki hänelle tilaa? Niinkuin kärppä
kivenkoloon tämä laiha olento hiipi suurempien ja karkeampien
ihmisten sekaan, jotka väistyivät syrjään hänen ohikulkiessaan.
Silmäniskusta pitkä Jakobini oven luona jätti tien vapaaksi mitään
kysymättä. Seuratkaamme häntä tyrannin luo.
VII LUKU.

"Päätettiin, että se, joka sanoisi hänen olleen ihmisen, kärsisi


kuolonrangaistuksen."

P. Augustinus, Serapis-jumalasta I, 18, De Civitate Dei, 5.

Robespierre nojasi väsyneesti taaksepäin nojatuoliinsa ja hänen


kalmakkaat kasvonsa näyttivät tavallista väsyneemmiltä. Hän, jolle
Catherine Theot lupasi kuolemattoman elämän, oli tosiaan sen
näköinen kuin kuoleman kynnyksellä oleva. Hänen edessään
pöydällä oli korillinen appelsiinejä, joiden mehu yksin saattoi
lieventää hänen ruumistaan vaivaavaa ankaraa sappitautia, niinkuin
kerrotaan. Rikkaasti puettu vanha nainen (hän oli entisen hallituksen
aikana ollut markiisitar) istui ja kuori jalokivin koristetuilla sormillaan
noita suloisia hedelmiä sairaalle lohikäärmeelle. Olen jo ennen
sanonut, että Robespierre oli naisten lemmikki. Kummallista kyllä,
mutta he olivatkin ranskalaisia naisia. Vanha markiisitar, joka,
niinkuin Catherine Theot, kutsui häntä "pojakseen", näytti todella
rakastavan häntä hurskaasti ja epäitsekkäästi kuin äiti lastaan. Kun
hän hedelmiä kuoriskeli ja niitä hänelle tyrkytteli hellillä hyväilyillä
kulki Robespierren laihojen huulien yli jotain elävän hymyn tapaista.
Etäämmällä istuivat Couthon ja Payan toisen pöydän ääressä,
kirjottelivat nopeasti ja pysähtyivät silloin tällöin työstään
kysyäksensä jotakin toisiltaan kuiskaten.

Äkkiä muuan Jakobini avasi oven, lähestyi Robespierreä ja kuiskasi


hänelle Guérinin[83] nimen. Tämän kuullessaan sairas hypähti
pystyyn, ikäänkuin uutta elämää saaden.

"Rakas ystäväni", sanoi hän markiisittarelle, "suo anteeksi, minä


en nyt tarvitse hellää huolenpitoasi. Ranska vaatii nyt huomioni. En
ole koskaan sairas silloin kun voin palvella isänmaatani."

Vanha markiisitar nosti silmänsä taivaaseen ja huokasi: "Mikä


enkeli!"

Robespierre viittasi kärsimättömästi kädellään, ja vanha nainen


taputti hänen kalpeita poskiaan, suuteli hänen otsaansa ja vetäytyi
tottelevasti pois. Seuraavana hetkenä tuo hymyilevä siivo mies, jota
vastikään kuvasimme, seisoi tyrannin edessä, syvään kumartaen. Ja
syystä mahtoi Robespierre lausua tervetulleeksi miestä, joka oli
hänen ovelimpia kätyreitään — johon hän luotti enemmän kuin
jakobinien klubiin, puheittensa sanatulvaan tai sotajoukkojensa
pajunetteihin. Guérin, kuuluisin hänen 'tutkistelijoistaan', urkkiva,
viekas, kaikkialle löytävä vakoilija liukui niinkuin auringonsäde seinän
rakojenkin läpi ja toi tiedon ei ainoastaan ihmisten töistä vaan
heidän sydämistäänkin.

"No, kansalainen, mitä kuuluu Tallienista?"

"Varhain tänä aamuna kaksi minuuttia kahdeksan jälkeen hän lähti


ulos."

"Niin varhain? hm!"


"Hän kulki pitkin katuja Rue des Quatre Fils, Rue du Temple, Rue
Martin; ei mitään merkillisempää paitsi —"

"Paitsi mitä?"

"Hän kävi eräässä kirjakaupassa ostamassa kirjoja."

"Ostamassa kirjoja! Ahaa, vilpistelijä, hän tahtoi vehkeilyn kätkeä


tiedonhalun vaipan alle. Entä sitten?"

"Viimein Rue des Fosses Montmarche kadulla eräs henkilö


(tuntematon) siniseen takkiin puettu, kohtasi hänet. He kävelivät
yhdessä pitkin katuja muutamia minuutteja ja heihin yhtyi
Legendre."

"Legendre, kuule Payan, ota vaarin."

"Minä menin hedelmäpuotiin ja palkkasin kaksi pientä tyttöä


menemään palloa heittelemään kuulomatkan päähän. He kuulivat
Legendren sanovan: 'minä luulen että hänen valtansa alkaa olla
loppumaisillaan'. Tallien vastasi: 'Ja hän itsekin. Minä en antaisi
kolmen kuukauden palkkaa hänen elämästään'. Minä en tiedä,
kansalainen, tarkottivatko he sinua."

"Enkä minä, kansalainen", vastasi Robespierre julmasti hymyillen,


jonka jälkeen hän kohta vaipui synkkiin mietteisiin. "Haa!" mutisi
hän, "minä olen nuori vielä, parhaimmassa iässäni. Minä en antaudu
ylellisyyksiin. Ei, ja minun ruumiinikin on terve — terve. Mitä muuta
Tallienista?"

"Se nainen, jota hän rakastaa — Teresa de Fontenai — joka on


vankilassa, jatkaa vielä kirjeenvaihtoaan hänen kanssaan ja pyytää
häntä pelastamaan itseään kuolemasta. Tämän minun mieheni
sattuivat saamaan tietää. Hänen palvelijansa on sanansaattajana
vangin ja Tallienin välillä."

"Vai niin! Palvelija on otettava kiinni keskellä Parisin katuja.


Hirmuhallitus ei ole vielä ohi. Noiden kirjeiden avulla, joita häneltä
löydetään, jos ne sitä sisältävät, minä sieppaan Tallienin istuimeltaan
kansalliskokouksessa."

Robespierre nousi ja astui muutaman kerran miettiväisenä


huoneessa, avasi sitten oven ja kutsui erään jakobinin sisään. Tätä
hän käski vartioimaan Tallienin palvelijaa ja vangitsemaan hänet
sopivalla hetkellä. Sitten hän taas heittäytyi tuoliinsa. Kun Jakobini
meni ulos, kuiskasi Guérin:

"Eikö tuo ole kansalainen Aristides?"

"On — uskollinen mies, kunhan vaan pesisi itseään eikä kiroilisi


niin kovin."

"Etkö sinä mestauttanut hänen veljensä?"

"Mutta Aristides hyväksyi tuomion."

"Siitä huolimatta, ovatko sellaiset miehet turvallisia niin lähellä


sinua?"

"Se on totta." Ja Robespierre otti muistikirjansa, kirjotti siihen


muistutuksen, pani sen liivintaskuunsa ja jatkoi:

"Mitä muuta Tallienista?"

"Ei mitään muuta. Hän ja Legendre ja tuntematon kävelivät Jardin


Egalite'lle päin ja erosivat siellä. Minä saatoin Tallienia hänen
kotiinsa. Mutta minulla on muita uutisia. Sinä pyysit minua etsimään
niitä, jotka sinua uhkaavat nimettömissä kirjeissä."

"Guérin, oletko löytänyt niitä? Oletko sinä — oletko?"

Ja puhuessaan tyranni avasi ja sulki kätensä ikäänkuin jo puristaen


kirjottajien henkiä, ja hänen kasvoillaan näkyi se
kouristuksentapainen irvistely, joka johtui hänen taipumuksestaan
kaatuvatautiin.

"Kansalainen, minä luulen tavanneeni yhden. Sinun pitää tietää,


että kaikkein pahimpia on maalari Nicot."

"Seis, seis!" sanoi Robespierre ja avasi muistiinpanokirjan, joka oli


sidottu punaisiin kirjailtuihin nahkakansiin (sillä Robespierre oli siisti
ja täsmällinen kuolinluetteloissaankin). Hän selaili aakkosellista
järjestystä: "Nicot, tuossa se on, ateisti, sansculotti (minä vihan
renttuja),[84] Hébertin ystävä. Ahaa! Huom.! René Dumas tuntee
hänen vanhemman elämänsä ja entiset rikoksensa. Jatka!"

"Tätä Nicotia on epäilty lentokirjasten levittäjäksi sinua ja


komiteaa vastaan. Eilen iltana, kun hän oli poissa, laski ovenvartija
minut hänen huoneeseensa Rue Beau-Repairella. Mestariavaimellani
avasin hänen kirjotuspöytänsä. Löysin siellä maalauksen sinusta
mestauslavalla seisomassa, ja sen alle oli kirjotettu —: 'Maasi
murhamies, lue rangaistuksesi tuomio.' Minä vertasin näitä sanoja
niihin kirjeisiin, joita minulle annoit, ja käsiala sopii yhteen niistä.
Katso, minä revin irti kirjotuksen."

Robespierre katsoi, hymyili, ja heittäytyi tuoliinsa, ikäänkuin kosto


jo olisi täytetty. "Hyvä! Minä pelkäsin, että se olisi joku
voimakkaampi vihollinen. Tämä mies täytyy heti vangita."
"Hän odottaa tuolla rappusissa. Minä menin hänen ohitsensa ylös
tullessani."

"Niinkö? laske sisään — ei, maltahan sentään Guérin, vetäydy


sisähuoneeseen, kunnes minä taas kutsun sinut luokseni. Rakas
Payan, katso perään, ettei Nicotilla ole aseita mukanaan."

Payan, joka oli yhtä rohkea kuin Robespierre oli arka, tukahutti
halveksivan naurun, joka oli päästä häneltä, ja lähti huoneesta.

Sillävälin Robespierre painoi päänsä rintaa vastaan ja näytti


vaipuneelta mietteihin. "Elämä on hyvin surullinen, Couthon", sanoi
hän äkkiä.

"Pyydän anteeksi, minä pidän kuolemaa vielä pahempana", vastasi


ihmisystävä lauhkeasti.

Robespierre ei vastannut vaan otti laukustaan sen merkillisen


kirjeen, joka myöhemmin tavattiin hänen papereittensa joukosta ja
joka julaistussa kokoelmassa on merkitty n:rolla 61.[85]

"Epäilemättä", se alkaa, "olet levoton, kun et ennemmin ole


minusta mitään kuullut. Älä ole huolissasi, sinä tiedät, että minä
ainoastaan kirjotan tavallisen sananviejän kautta, ja koska hänet
keskeytettiin viimeisellä matkallaan, on se viipymiseen syynä. Kun
saat tämän kirjeen, niin käytä kaikkia keinojasi paetaksesi
näyttämöltä, missä tulet esiintymään viimeisen kerran, jos esiinnyt.
Turha olisi uudelleen mainita kaikkia syitä, jotka asettavat sinut
vaaraan. Viimeinen askeleesi, jonka pitäisi nostaa sinut valtion
päämiehen istuimelle, vie sinut kuitenkin mestauslavalle, ja alhaiso
tulee sylkemään kasvoillesi, niinkuin se on sylkenyt niiden kasvoille,
jotka olet tuominnut. Koska olet koonnut itsellesi riittävät
elantovarat, odotan sinua kärsimättömästi, nauraakseni sinun
kanssasi sille osalle, mitä olet näytellyt tämän kansan vaikeuksissa,
kansan, joka on yhtä herkkäuskoinen kuin se on halullinen
uutuuksiin. Ryhdy toimenpiteisiin meidän suunnitelmiemme mukaan
— kaikki on valmiina. Minä lopetan. Kirjeenkantajamme odottaa.
Odotan vastaustasi."

Hitaasti ja miettivästi diktaattori ahmi tämän kirjeen sisällön. "Ei",


sanoi hän itsekseen, "ei, se, joka on maistanut valtaa, ei voi enää
nauttia lepoa. Danton, Danton, sinä olit oikeassa: 'parempi on olla
köyhä kalastaja kuin hallita ihmisiä'."

Ovi avautui, Payan palasi ja kuiskasi Robespierrelle: "Kaikki


turvallista. Kutsu sisään mies."

Diktaattori tyytyväisenä käski palvelevan jakobinin tuoda Nicot


hänen eteensä. Maalari astui sisään, rumissa kasvoissaan peloton
ilme, ja seisoi suorana Robespierren edessä, joka syrjäsilmällä häntä
mittaili.

On merkillistä, että useimmat vallankumouksen päämiehistä olivat


perin rumia ulkonäöltään — Mirabeau ja Danton tavattoman rumia,
David ja Simon julman ja raa'an näköisiä, Marat likaisen inhottava ja
diktaattori synkkä ja sappikarvainen. Mutta kuten Robespierren
sanottiin muistuttavan kissaa, oli hän myöskin siisti kuin kissa. Hänen
pukunsa oli sileä ja puhdas, leuka puhtaaksi ajettu, laihat kädet
valkoiset kuin naisen kädet. Sentähden hän oli suurena vastakohtana
sille renttumaisuudelle, joka näkyi Nicotin koko käytöksessä ja
ulkomuodossa.

"Sinä siis, kansalainen", sanoi Robespierre lempeästi, "tahdot


puhua kanssani? Minä tiedän, että ansiosi ja kansalaishyveesi on
liian kauan jäänyt huomaamatta. Sinä tahtoisit pyytää jotakin
sopivaa tointa valtiossa? Älä arkaile — sano vaan!"

"Jalo Robespierre, sinä, joka maailmaa valaiset, minä en tule


sinulta pyytämään suosionosotusta vaan tekemään valtiolle
palveluksen. Olen löytänyt kirjeenvaihdon, joka paljastaa salaliiton,
mihin kuuluu monta vielä epäilyksistä vapaata miestä." Ja hän pani
paperit pöydälle. Robespierre tarttui niihin ja silmäili niiden yli
kiihkeästi ja nopeasti.

"Hyvä, hyvä", hän mutisi itsekseen, "tätä kaikkea tarvitaan.


Barrère, Legendre, siinäpä ovat! Camille Desmoulins oli ainoastaan
heidän kätyrinsä. Minä rakastin häntä kerran, heitä en koskaan ole
rakastanut. Kansalainen Nicot, minä kiitän sinua. Huomaan, että
nämä kirjeet ovat kirjotetut englantilaiselle. Jokaisen Ranskalaisen
täytyy epäillä näitä englantilaisia susia lammasten vaatteissa! Ranska
ei enää tarvitse koko-maailman-kansalaisia, se leikki loppui
Anacharsis Clootziin.[86] Pyydän anteeksi, kansalainen Nicot: Clootz
ja Héberthän olivat sinun ystäviäsi."

"Niin", vastasi Nicot puolustellen, "me kaikki olemme erehdyksille


alttiita. Minä lakkasin heitä kunnioittamasta, kun sinä asetuit heitä
vastaan, sillä en luottaisi omaan aistimiinikaan niinkuin sinun
oikeudentuntoosi."

"Niin, minä todella tahdon olla oikeamielinen, sen hyveen minä


luen itselleni", sanoi Robespierre makeasti, ja kissaluonteellaan hän
nautti leikkimisestä avuttoman uhrin kanssa[87] tälläkin ratkaisevalla
hetkellä, jolloin niin suuret suunnitelmat, niin uhkaava vaara ja
kauanmietitty kosto vaativat hänen huomionsa. "Eikä minun
oikeudentuntoni tule kauemmin unohtamaan sinun palveluksiasi,
hyvä Nicot. Sinä tunnet tämän Glyndonin?"
"Tunnen hyvin. Hän oli ystäväni, mutta minä uhraisin oman
veljeni, jos tämä olisi yksi 'hairahtuneista'. Minä en häpee sanoa,
että olen saanut hyvyyden osotuksia tältä mieheltä."

"Vai niin — ja sinä kannatat rehellisesti sitä oppia, että jos joku
minun henkeäni uhkaa, ovat kaikki personalliset suhteet
unohdettavat?"

"Aivan niin."

"Hyvä kansalainen, rakas Nicot, ole niin hyvä ja kirjota minulle


tämän
Glyndonin osote."

Nicot astui pöydän ääreen, ja äkkiä, kun kynä oli hänen


kädessään, juohtui hänen mieleensä ajatus ja hän pysähtyi
hämmentyneenä.

"Kirjota nyt, rakas Nicot!"

Maalari totteli hitaasti.

"Mitä muita tuttavia on tällä Glyndonilla?"

"Siitä asiasta minä tahdoinkin puhua sinulle, edustaja", vastasi


Nicot. "Hän käy joka päivä naisen luona, joka on muukalainen ja
tuntee kaikki hänen salaisuutensa. Nainen on olevinaan köyhä ja
elättävinään lastaan käsityöllä. Mutta hän on äärettömän rikkaan
italialaisen puoliso, eikä ole epäilystäkään siitä, että hänellä on
rahoja, jotka käytetään Ranskan kansalaisten turmelemiseen. Hän
olisi otettava kiinni."

"Kirjota hänenkin nimensä."


"Mutta ei saa hukata aikaa, sillä tiedän, että molemmat aikovat
paeta
Parisista jo tänä yönä."

"Meidän hallituksemme on valpas ja nopea, hyvä Nicot, älä pelkää.


Vai niin, vai niin", ja Robespierre otti paperin, johon Nicot oli
kirjottanut, pani sen nenänsä alle — sillä hän oli likinäköinen — ja
lisäsi hymyillen: "Kirjotatko sinä aina samalla käsialalla, kansalainen?
Tämä näyttää tekaistulta."

"Minä en tahtoisi, että he saisivat tietää, kuka on heidät antanut


ilmi."

"Hyvä, hyvä. Sinun hyveesi tulee kyllä palkituksi, luota minuun.


Terveys ja veljeys!"

Robespierre nousi puoleksi istualtaan ja Nicot lähti pois.

"Hoi, mies siellä ulkona!" huusi diktaattori kelloaan soittaen, ja kun


Jakobini valppaasti totteli kutsua — "seuraa tuota miestä, Jean
Nicotia. Niinpiankuin hän pääsee talosta, ota kiinni hänet. Vie hänet
heti vankilaan. Kuule — tämä on ihan laillista, siinä on
vangitsemiskäsky. Yleinen syyttäjä saa minulta toimintaohjeita. Mene
nyt vikkelään!"

Jakobini hävisi. Kaikki sairauden ja heikkouden jäljet olivat


potilaalta kadonneet, hän seisoi suorana lattialla, kasvot
suonenvedon tapaisesti värähtäen ja käsivarret ristissä. "Hoi, Guérin
(vakoilija näyttäytyi taas) ota nämä osotteet. Tunnin kuluttua täytyy
tämän englantilaisen ja tämän naisen olla vankilassa; heidän
paljastuksensa tulevat auttamaan minua tärkeämpiä vihollisia
vastaan. He tulevat kuolemaan, he tulevat hukkumaan muiden
kanssa 10 p:nä — kolmen päivän päästä. Siinä on sinullekin
vangitsemiskäsky. Lähde!"

"Ja nyt, Couthon, Payan, me emme enää vitkastele Tallienin ja


hänen joukkonsa kanssa. Minä olen saanut tietää, ettei
kansalliskokous tahdo mennä juhlaan 10 p:nä. Meidän täytyy
turvautua miekkaan ja oikeuslaitokseen. Minun täytyy järjestää
ajatuksiani, valmistaa puhettani. Huomenna minä esiinnyn
kokouksessa, huomenna rohkea St. Just yhtyy meihin, tultuaan
voitokkaitten sotajoukkojen luota, huomenna minä puhujalavalta
sinkautan salamoita Ranskan salapukuisia vihollisia vastaan,
huomenna minä pyydän, koko kansan silmien edessä, vehkeilijöiden
päät."
VIII LUKU.

"Tapparat on vastaasi kohotettu joka puolelta."

La Harpe, Jeanne de Naples, IV, 4

Tällä välin Glyndon oli pitkän aikaa viipynyt C:n puheilla ja


järjestänyt viimeisiä asioita, menestykseen luottaen ja näkemättä
mitään paon estettä. Sieltä hän lähti Filliden luokse. Samalla hän
keskellä iloisia ajatuksiaan oli kuulevinaan äänen, liiankin tutun ja
kauhistuttavan, kuiskaavan korvaansa: "Mitä! sinä tahdot uhmata
minua ja päästä minusta karkuun, sinä tahdot palata hyveeseen ja
tyytyväisyyteen. Se on turhaa, se on liian myöhäistä. Minä en tule
sinua ahdistamaan, nyt sinua seuraavat ihmisaskeleet, yhtä
leppymättömät kuin minun. Minua et sinä näe ennenkuin vankilassa,
yösydännä ennen kuolemaasi. Katso —"

Ja Glyndon käänsi tahtomattaan päänsä ja näki ihan lähellään


hiipivän miehen, jonka hän ennenkin oli huomannut kulkevan
ohitsensa useamman kerran, vaikkei hän ollut siitä välittänyt. Heti
hän vaistomaisesti tiesi olevansa vartioitu, takaa-ajettu. Katu oli
tässä tyhjä ja autio, sillä päivä oli tukahuttavan kuuma ja tähän
aikaan päivästä ei ollut paljon väkeä liikkeellä. Vaikka hän oli rohkea,
kulki hänen sydämensä läpi kylmä väristys. Hän tunsi liiankin hyvin,
minkälainen hirmuhallinto vallitsi Parisissa, ja tiesi vaaransa. Samaa
mitä ensimäisen paiseen ilmestyminen on ruton uhrille, samaa oli
vallankumouksen uhreille varjomaisen vakoilijan näkeminen.
Vartioiminen, vangitseminen, tutkinto, guillotiini — näillä
säännöllisillä, nopeilla askelilla kulki se hirviö, jota anarkistit kutsuivat
laiksi. Glyndon hengitti syvään ja kuuli selvästi oman sydämensä
kovan tykytyksen. Sitten hän pysähtyi liikkumattomana tuijottaen
varjoa, joka myöskin pysähtyi.

Urkkijalla ei ollut apulaisia ja katu oli tyhjä; Glyndon sai uutta


rohkeutta. Hän lähestyi takaa-ajajaansa, joka peräytyi hänen
edestään. "Kansalainen, sinä seuraat minua", hän sanoi, "mitä
asiaa?"

Halveksivasti hymyillen vastasi mies: "Eikö katu ole kylliksi leveä


meille molemmille? Ethän liene niin huono tasavaltalainen, että
vaatisit koko Parisin itsellesi?"

"Kulje sitten edellä. Minä annan tietä."

Mies kumarsi, nosti kohteliaasti hattuaan ja kulki edelleen.


Seuraavana hetkenä Glyndon syöksyi sivukujaan ja juoksi nopeasti
pitkin kierteleviä katuja ja mutkikkaita käytäviä. Vähitellen hän
rauhottui, katsahti taakseen ja luuli päässeensä takaa-ajajasta;
kiertoteitä pitkin hän palasi kotiinsa päin. Kun hän tuli leveämmille
kaduille, niin viittaan kääritty ohikulkija äkkiä sipaisi häntä, niin ettei
hän nähnyt sen kasvojakaan: "Clarence Glyndon, sinua väijytään,
seuraa minua!" ja käveli nopeasti hänen edellään. Glyndon kääntyi ja
näki kauhukseen taas kintereillään saman liuhunaamaisen miehen,
jolta hän jo luuli päässeensä turvaan. Hän unohti muukalaisen
kehotuksen ja heittäytyi väkijoukon sekaan, joka oli kokoontunut
pilakuva-kaupan ympärille; sieltä hän muutti suuntaa, lähti aivan
toisille kaduille sekä saapui pitkän hengästyneen riennon jälkeen
erääseen kaupungin etäisimpään osaan näkemättä enää vakoilijaa.

Täällä kaikki näytti niin levolliselta ja kauniilta, että uhkaavalla


vaaranhetkelläkin hänen taiteilijasilmänsä pysähtyi näköalaa
ihailemaan. Tässä oli joen rantamalla avonaisempi paikka. Seine
virtasi majesteetillisena tietään ja sen pinnalla keikkui pursia ja
suurempia aluksia. Aurinko kultasi tuhansia kirkontorneja ja kimalteli
hävinneen ritariajan palatsien valkoisille seinille. Väsyneenä ja
huohottavana Glyndon pysähtyi hetkeksi ja hänen otsaansa leyhytteli
virralta tuleva vilpoinen tuulahdus.

"Hetkeksi minä ainakin olen turvassa täällä", hän ajatteli, mutta


samassa hän n. 30 askeleen päässä näki vakoilijan. Hänen jalkansa
tuntuivat puutuvan paikoilleen, hän oli niin nääntynyt, että pako oli
miltei mahdoton. Toisella puolella oli joki (ei mitään siltaa lähellä) ja
toisella puolella pitkä talorivi. Hän kuuli naurua ja rivoa laulua
eräästä talosta, joka oli hänen ja vakoilijan välillä. Se oli
pahamaineinen kahvila, Henriotin mustien joukkojen, Robespierren
kätyreiden tavallinen kokoontumispaikka. Urkkija oli siis ajanut
uhrinsa suoraan koirien kynsiin. Hän lähestyi hitaasti, pysähtyi
kahvilan avonaisen ikkunan eteen ja pisti päänsä sisään ikäänkuin
kutsuakseen sieltä aseellisia miehiä avukseen.

Juuri samassa hetkessä, kun urkkijan pää oli pois käännetty,


huomasi Glyndon muukalaisen, joka oli häntä varottanut, seisomassa
ihan edessään puoleksi avatun oven suussa. Mies, jota tuskin näkyi
suuresta viitastaan, kutsui häntä astumaan sisään. Äänettömästi hän
totteli ystävällistä kutsua, ovi sulettiin heidän jälkeensä ja henkeään
vetämättä kulki hän muukalaisen jälessä ylös leveitä portaita ja
monen tyhjän huoneen läpi. Kun he saapuivat pieneen kamariin,
riisui saattaja hattunsa ja pitkän viittansa, joka tähän asti oli hänet
peittänyt, ja Glyndon tunsi Zanonin.
IX LUKU.

"Äl' usko, että taikani on tehty


Helvetin enkeleitten avulla.
Kirottu, häväisty se olkoon aina,
Ken noita hirviöitä kutsuu esiin!
Vaan käyttänyt oon salaisia voimia
Lähteissä läikkyvissä, lehdon yrteissä
Ja luonnon sisimmissä sopukoissa
Ja vuorten yli liikkuvissa tähdissä."

Tasso, Ger. Lib. XIV, 43.

"Täällä olet turvassa, nuori englantilainen!" sanoi Zanoni, viitaten


Glyndonia istumaan. "Onnellista oli, että viimeinkin sain sinusta
selvän."

"Paljon onnellisempi olisi ollut, jollemme koskaan olisi


tavanneetkaan toisiamme! Kuitenkin näinä kohtaloni viimeisinä
hetkinäkin minua ilahuttaa taas nähdä sinun kasvojasi, salaperäinen
olento, jota pidän syynä kaikkiin tuntemiini kärsimyksiin. Täällä sinä
siis et voi tehdä verukkeita tai välttää minua. Täällä, ennenkuin me
eroomme, sinun täytyy paljastaa minulle jollei oman elämäsi niin
ainakin minun elämäni pimeä arvotus."

"Oletko kärsinyt, kokelas raukka?" sanoi Zanoni säälivästi. "Niin —


näen sen kyllä kasvoistasi. Mutta miksikä minua siitä moitit? Enkö
minä varottanut sinua oman henkesi kuiskauksia seuraamasta? Enkö
pyytänyt sinua siitä kieltäytymään? Enkö sanonut, että koetus olisi
hirvittävä uhkayritys ja kauhun ansa? Niin, enkö tarjonnut sinulle sen
sijasta sitä sydäntä, joka oli riittävä minuakin tyydyttämään? Etkö
sinä itse huimapäisesti ja päättävästi valinnut vihkimyksen koetusta?
Omasta vapaasta tahdostasi olet ottanut Mejnourin mestariksesi ja
antautunut hänen viisauttaan tutkimaan."

"Mutta mistä johtui vastustamaton haluni tähän outoon ja


luvattomaan tietoon? Minä en tiennyt siitä, ennenkuin sinun paha
silmäsi sattui minuun ja ennenkuin tulin vedetyksi sinun
Iumouspiiriisi."

"Sinä erehdyt — halu oli sinussa jo ennen, ja se olisi aina


raivannut tiensä toiseen tai toiseen suuntaan. Ihminen, sinä kysyt
minulta oman kohtalosi ja minun kohtaloni arvotusta! Katso
ympärillesi elämässä, eikö kaikkialla ole salaisuuksia? Voiko silmäsi
seurata siemenen vaiheita maan helmassa? Siveellisessä samoin kuin
fyysillisessä maailmassa on hämäriä kummallisuuksia, paljon
ihmeellisempiä kuin mitä luulet minun yhteydessäni olevan."

"Kiellätkö sinä itselläsi olevan näitä voimia? — tunnustatko itsesi


pettäjäksi? — vai sanotko todella, että olet myynyt itsesi Pahalle?
että sinä olet maagikko ja käytät avuksesi samanlaista olentoa kuin
mikä minua on kiusannut päivin ja öin?"
"Ei ole kysymys siitä, mitä minä olen", vastasi Zanoni, "vaan on
ainoastaan kysymys, voinko minä auttaa sinua karkottamaan tuon
julman haamun ja palaamaan taas tavallisen elämän terveelliseen
ilmapiiriin. Vähäsen kuitenkin kerron sinulle, puolustaakseni, ei
itseäni, vaan Taivasta ja Luontoa, joita epäilyksilläsi loukkaat."

Zanoni vaikeni hetkeksi ja jatkoi hiukkasen hymyillen:

"Nuorempina päivinäsi olet ehkä ilolla lukenut sitä suurta kristillistä


runoilijaa, jonka kantele tuli maan päälle 'seppelöitynä paratiisista
poimituilla kukilla', niinkuin hän itse sanoo aamunkoitosta.[88]
Tuskin kukaan oli niin sälytetty kuin hän ritariajan taikauskolla ja
totta tosiaan on 'Jerusalemin' runoilija kyllin voimakkaasti,
inkvisitsioninkin vaatimusten tyydyttämiseksi, kironnut niiden
luvattomien taikojen tekemistä, joilla 'Kokytosta ja Flegetonia[89]
hallittiin.' Mutta surujensa ja kärsimystensä ajalla, vankilassa ja
houruinhuoneessa, etkö tiedä, että silloin Tasso itse löysi
lohdutuksensa ja pelastuksensa pyhän ja henkisen teurgian[90]
tunnustamisesta — magian, jolla voitiin kutsua esiin enkeleitä eli
hyviä henkiä eikä pahoja? Ja etkö muista, kuinka syvästi perehtynyt
aikaansa nähden hän oli jalomman plaatolaisuuden mysterioihin,
jotka viittaavat tähtöisten veljeskuntien salaisuuksiin, kaldealaisista
rosenkreutsiläisiin asti, ja kuinka hän ihanissa runoissaan tekee
erotuksen Ismenon mustan noituuden ja Tietäjän kunniallisen
viisauden välillä, Tietäjän, joka Pyhän Maan matkalaisia neuvoi ja
johti heidän retkillään? Hän ei tehnyt taikojaan maanalaisten
kapinoitsijain avulla[91] vaan lähteitten ja kasvien salaisten voimien
käyttämisellä — tuntemattoman luonnon ihmeiden ja tähtien
liikuntojen tarkkaamisella. Hän kulki Libanonin ja Karmelin pyhillä
vuorilla ja näki jalkainsa alla pilvet ja lumen ja taivaankaaren värit ja
sateen ja kasteen syntymisen. Se kristitty erakko, joka käännytti
Tietäjän (ja joka varmaan ei ollut mikään taruolento vaan
perustyyppi jokaisen hengen, mikä Luonnon kautta pyrkii Jumalaan),
käskikö hän Tietäjää panemaan pois nuo korkeat tutkimukset,
salaisen viisauden taidon? Ei, vaan hän käski niitä harjottamaan ja
käyttämään arvokkaisiin tarkotuksiin. Ja tässä runoilijan
suurenmoisessa käsityksessä on todellisen teurgian salaisuus, joka
näinä oppineempina aikoina hämmästyttää teitä tietämättömiä ja saa
teitä pitämään sitä lapsellisena harhauskona tai sairaan houreina."

Taas Zanoni pysähtyi ja jatkoi sitten:

"Hyvin kaukaisia aikoja sitten — sellaisena sivistyskautena, jolloin


ei niinkuin nyt yksilö upotettu valtioon — oli olemassa palavajärkisiä
ihmisiä, joissa eli voimakas tiedonhalu. Niissä mahtavissa ja
onnellisissa valtioissa, joissa he elivät, ei ollut maallisia rientoja ja
valtiollisia kuohuja, joihin he olisivat saaneet purkaa mielensä
kuumeellisen kiihkon. Vanhan kastilaitoksen puitteissa, joita ei
väkivoiminkaan voinut yksilö murtaa, asui viisauden jano ainoastaan
niiden keskuudessa, joissa se etuoikeutena kävi perintönä isästä
poikaan. Sentähden jo siitäkin vähästä, mitä historianne kertoo
ihmistiedon kehityksestä, voitte huomata, että vanhimpina aikoina
filosofia ei laskeutunut alas ihmisten askareihin ja kotoisiin oloihin.
Se viihtyi ylemmän luomisjärjestön ihmeissä, se koetti tutkistella
aineen syntyä ja hallitsevan sielun olemusosia, se koetti lukea
taivaankappaleitten salaisuuksia, se koetti tunkea niihin luonnon
syvyyksiin, joissa oppineet sanovat Zoroasterin ensimäisenä
löytäneen sen taidon, mitä te tietämättömyydessänne kutsutte
noituudeksi. Tuona aikana kohosi muutamia henkilöitä, jotka oman
säätyluokkansa turhuuksien ja harhauskojen keskeltä arvelivat
löytävänsä sätehiä kirkkaammasta ja vahvemmasta viisauden
valosta. He arvelivat, että oli yhteyttä kaikkien luomakappalten välillä
ja että alimmassa oliossakin piili salainen vastaavaisuus, joka saattoi
johtaa sen ylös korkeimpaan asti.[92] Vuosisatoja vieri ja
elämänkausia tuhlaantui näihin tutkimuksiin, mutta yksi askel
toisensa jälkeen pantiin muistoon ja näistä tuli tienviittoja niille
harvoille, joilla yksin oli perinnöllinen oikeus kulkea samaa tiedon
tietä. Viimein hämärästä koitti valo muutamille, mutta älä luule, nuori
näkyjen näkijä, että se valo suotiin sellaisille, jotka sydämessään
elättivät epäpyhiä ajatuksia ja joita pahan perijuuri vielä hallitsi. Se
suotiin silloin niinkuin nytkin ainoastaan unelmoimisen ja
järkeilemisen puhtaimpina 'haltioissaolon' hetkinä, jolloin
jokapäiväisen elämän huolet ja yhteisen lihallisen luontomme halut
eivät kiinnitä huomiota. Kaukana siitä että he olisivat turvautuneet
pahojen henkien apuun, oli päinvastoin heidän jalona
pyrkimyksenään tulla yhä lähemmälle Hyvän Lähdettä. Mitä
enemmän he irrottautuivat planettojen pimeistä esikartanoista, sitä
enemmän heidät täytti Jumaluuden loisto ja hyvyys. Ja jos he
etsiessään viimein löysivät, kuinka hengen silmälle kaikki
olemassaolon ja aineen hienoimmat muodostelmat voivat avautua
nähtäviksi, — jos he keksivät, kuinka hengen siiville kaikki etäisyydet
tulivat mitättömiksi ja vapautunut idea saattoi kulkea tähdestä
tähteen, vaikka ruumis täällä makasi jäykkänä ja kovana kuin hylätty
hautakivi — jos he sellaisia keksintöjä todella tekivät, niin heidän
tietonsa ylevin huippu oli vain — ihmetellä, ihailla ja kunnioittaen
palvella! Muuan, joka näitä asioita hyvin tunsi, sanoi näin: "Sielussa
on prinsiippi, kaikkea ulkonaista luontoa korkeampi, ja tämän
prinsiipin kautta me voimme nousta maailman järjestyksen yli ja tulla
osalliseksi ylhäisten taivaallisten olentojen kuolemattomasta
elämästä ja voimasta. Kun sielu nousee korkeampiin olentoihin
('haltioihin'), niin se jättää sen järjestön, johon se ajaksi on sidottu,
ja uskonnollisen magnetismin kautta vetäytyy toiseen ylempään
piiriin, johon se sulautuu ja yhtyy."[93]

"Otaksu siis, että tuollaiset olennot viimein löysivät sen


salaisuuden, miten kuolema on estettävä saapumasta ja miten
vaaroja ja vihollisia on vältettävä, miten on kapinoitten ja
vallankumousten keskellä käytävä viottumatta, niin luuletko, että
elämä saattoi heissä herättää korkeampaa halua kuin vielä enemmän
ikävöidä kuolemattomuutta kohti ja valmistaa älyään sitä
korkeampaa olemassaoloa varten, johon he voivat siirtyä, kun aika ja
kuolo ovat menneet ohi! Pois synkät kuvittelusi noidista ja pahoista
hengistä, sielu voi kaivata ainoastaan valoa kohti, ja meidän korkean
tietomme erehdyskin oli vain siinä, että unohdimme ne heikkoudet,
himot ja siteet, joita vasta kuolema voi täydellisesti puhdistaa."

Tämä puhuttelu oli niin toisenlainen kuin mitä Glyndon oli


odottanut, että hän kotvasen aikaa pysyi sanattomana ja viimein
sopersi:

"Mutta miksi sitten minulle —"

"Miksi", toisti Zanoni, "miksi sinulle on koitunut ainoastaan


rangaistus ja kauhu —: ja tiellesi astunut Kynnyksen Vartija?
Itserakas mies, katso, millaiset ovat tavallisimmankin opin alkeet!
Voiko jokainen vastalkaja paljaalla toivomuksellaan päästä
mestariksi? Voiko oppilas, kun hän on ostanut Euklideensä, tulla
Newtoniksi? Voiko nuorukainen, jolla on runollisia puuskia, sanoa:
'minä tahdon kilpailla Homeron kanssa'. Niin, voiko tuo kalpea
tyranni kaikilla järjestelmän-rakentajillaan ja paperilaeillaan ja
pelottomilla sotajoukoillaan, voiko hän tahtonsa mukaan muovata ja
valmistaa valtiolaitoksen, joka olisi vähemmän paha kuin se, minkä
alhaiso heitti ylösalaisin? Kun tuona kaukaisena aikana, josta puhuin,
tutkija pyrki niille korkeuksille, joille sinä olisit yhdellä hyppäyksellä
tahtonut ponnahtaa, silloin häntä harjotettiin kehdosta asti tulevaa
uraansa varten. Hänen silmilleen tehtiin selväksi sisäinen ja
ulkonainen luonto, vuosi vuoden jälkeen, mitä enemmän hän oppi
katselemaan ympärilleen. Häntä ei laskettu todelliseen
vihkimyskokeeseen, niinkauan kuin yksikin maallinen halu kahlehti
sitä ylevää lahjaa, jota te kutsutte Mielikuvitukseksi, tai yksikään
lihallinen himo himmensi sitä ihmisen kaikkiläpäisevää kykyä, jota te
kutsutte Älyksi. Ja silloinkin kuinka harvat parhaimmilla
voimillaankaan saavuttivat viimeisen mysterion! Onnellisempia he
olivat, koska he sitä pikemmin pääsivät niihin pyhiin ihanuuksiin,
joihin kuolema avaa taivaallisen portin."

Zanoni vaikeni ja miettiväinen ja surullinen varjo himmensi hänen


ylimaallista kauneuttaan.

"Ja onko tosiaan muitakin kuin sinä ja Mejnour, jotka väittävät


saavuttaneensa noita kykyjä ja noita salaisuuksia?"

"Muita on ollut ennen meitä, mutta me kaksi olemme nyt ainoat


maan päällä."

"Petturi! sinä puhut ristiin. Jos he voivat kuoleman voittaa,


mikseivät he enää ole elossa?"[94]

"Päivän lapsi", sanoi Zanoni murheellisena, "enkö ole sanonut


sinulle, että meidän tietomme erehdys oli, että unohdimme niitä
haluja ja himoja, joita henki ei koskaan voi kokonaan ja lopullisesti
voittaa, niinkauan kuin tämä aine sen verhoo. Etkö ajattele, kuinka
surullista on hylätä kaikki inhimilliset siteet, kaikki ystävyys ja kaikki
lempi ja nähdä päivä päivältä ystävyyden ja rakkauden kuihtuvan
elämästämme, niinkuin kukat rungosta lakastuvat ja pois putoovat?
Voitko ihmetellä sitä, että me mieluummin valitsemme kuoleman,
ennenkuin tavallinen ikämmekään on päättynyt, vaikka voisimme
elää maailman loppuun asti? Ihmettele pikemmin, että on kaksi,
jotka niin uskollisesti ovat riippuneet maassa kiinni! Minua, sen
tunnustan, tämä maa vielä voi hurmata. Kun minä saavutin viimeisen
salaisuuden, oli nuoruuteni vielä kukassaan, ja nyt yhä vielä nuoruus
ympäröi minua uhkealla kauneudellaan ja hengittäminenkin on
minulle nautintoa. Tuoreus ei ole hävinnyt luonnon kasvoilta eikä ole
yhtään kasvia, jossa en löytäisi uutta lumousta — ennen
keksimättömiä ihmeitä. Niinkuin on minun nuoruuteni, niin on
Mejnourin vanhuuden laita. Hän voisi sinulle kertoa, että elämä
hänelle merkitsee vain kykyä tutkimaan, eikä hän toivo uusia maita
uudestisyntyneen henkensä tutkimusaloiksi, ennenkuin hän on
tyhjentänyt kaikki ihmeet, mitkä Luoja on tämän maan päälle
istuttanut. Me olemme kahden katoomattoman harrastuksen
edustajia — taiteen, joka nauttii, ja tieteen, joka katselee. Ja nyt,
jotta tyytyisit siihen, ettei sinulle ole suotu näitä salaisuuksia, opi
tietämään, että niin täydellisesti täytyy ajatuksen irrottautua
kaikesta, mikä muodostaa ihmisten tavallisen elämän ja kiihottaa
heidän tunteitaan, niin täydelleen täytyy sen olla itsestään
tyhjentänyt kaiken halun, lemmen ja vihan, että kunnianhimoiselle ja
rakastajalle ja vihaajalle ei riitä siihen työhön voimaa.

"Ja minä, joka viimein olen antanut tavallisten perhesiteiden


itseäni kahlehtia ja sokaista, minä pimittynyt ja avuton, vannotan
sinua epäonnistunutta ja tyytymätöntä, minä vannotan sinua
opastamaan minua, sanomaan, missä he ovat. Oi, kerro minulle,
puhu! Vaimoni, lapseni! Sinä vaikenet — mutta tiedäthän nyt, etten
ole mikään paha noita, mikään vihollinen. Minä en voi antaa sinulle
sitä, mihin omat kykysi eivät riitä, minä en voi saada aikaan sitä, jota
ei himoton Mejnourkaan voinut, mutta minä voin antaa sinulle
lähinnä suurimman ja ehkä kauneimman lahjan, minä voin sovittaa
sinut jokapäiväisen maailman kanssa ja rakentaa rauhan
omantuntosi ja itsesi välille."

"Lupaatko?"

"Heidän suloisten henkiensä nimessä, lupaan."

Glyndon katsoi ja uskoi. Hän kuiskasi Violan osotteen, sen talon


nimen, johon hänen oma paha kohtalonsa jo oli vienyt kärsimyksen
ja tuomion.

"Siunattu olet siitä", huudahti Zanoni intohimoisesti, "ja sinä tulet


siunatuksi. Mitä! etkö sinä käsittänyt, että kynnyksellä kaikkiin
korkeampiin maailmoihin mennessä asuvat ne olennot, jotka kauhua
ja pelkoa synnyttävät? Kuka jokapäiväisessä maailmassakin jätti
Tavan ja Perimyksen vanhat ladut tuntematta ensi hetkestä
muodottoman ja nimettömän Pelon lähestymistä? Kaikkialla
ympärilläsi, missä ihmiset ponnistavat ja tekevät työtä, kaikkialla
lymyy pimeänä tuo sanomaton Kauhu, vaikkeivät he sitä näe —
viisaiden kamareissa, kansanjohtajien neuvostossa, sotamiesten
leirissä, joka paikassa. Mutta siellä, minne sinä yritit mennä, siellä
ainoastaan se on näkyväinen. Eikä koskaan se lakkaa vainoomasta,
ennenkuin voit yhtyä Äärettömään niinkuin serafi tai lapsena palata
tavalliseen maailmaan. Mutta vastaa minulle: kun olet koettanut
pitää kiinni jostakin vakavasta hyvästä päätöksestä ja haamu silloin
äkkiä on sivullesi hiipinyt; kun sen ääni on sinulle epätoivoa
kuiskannut; kun sen aavemaiset silmät ovat sinut pelotuksellaan
ajaneet takaisin maallisen voitonhimon tai rajun nautinnonhalun
näyttämöille, joista haamu aina pysyy poissa, koska se silloin jättää
sielun pahempien vihollisten käsiin — etkö silloin ole koskaan
sanonut: 'Tulkoon mikä tulee, hyveessä minä pysyn kiinni'?"
"Voi!" vastasi Glyndon, "vasta aivan äskettäin olen uskaltanut näin
tehdä."

"Ja sinä olet tuntenut, että haamu silloin tuli yhä himmeämmäksi
ja sen voima yhä heikommaksi."

"Se on totta."

"Iloitse siis! sinä olet voittanut pelon ja löytänyt koetuksesi


salaisuuden. Päättäväisyys on ensimäinen menestys. Iloitse, sillä sen
karkottaminen on voitollinen ja varma. Sinä et ole niitä, jotka
kieltäen tulevaisen elämän jäävät Sanomattoman Kauhun orjiksi. Oi,
milloin ihmiset viimeinkin oppivat, että jos kerran Suuri Uskonto niin
voimakkaasti terottaa uskon välttämättömyyttä, niin se ei tapahdu
ainoastaan sitä varten, että usko johtaa tulevaiseen elämään, vaan
että ilman uskoa ei ole mitään ylevätä tässäkään elämässä. Usko on
jotakin viisaampaa, onnellisempaa, jumalallisempaa kuin mitä maan
päällä näemme — taiteilija kutsuu sitä ihanteeksi, pappi uskoksi.
Ihanne ja usko ovat samoja käsitteitä. Palaja, vaeltaja, palaja!
Tunne, mikä kauneus ja pyhyys asuu vanhassa ja tavanmukaisessa
olossa. Takaisin ulos portista hiivi, kauhuolento, ja rauhallisena
hymyile taas, oi sininen taivas lapsensydämeen, ja sinun aamu- ja
iltatähtesi on sama, vaikka sillä on kaksi nimeä: Muisto ja Toivo."

Näin puhuessaan Zanoni lempeästi laski kätensä ihmettelevän


kuuntelijan polttaville ohimoille, ja samassa Glyndon tunsi
vaipuvansa jonkinlaiseen horrokseen: hän kuvitteli palanneensa
lapsuudenkotiinsa ja olevansa siinä pienessä huoneessa, missä äiti
oli valvonut hänen vuoteensa ääressä ja rukoillut hänen kanssaan.
Siinä oli sama huone — näkyvänä, kouriintuntuvana, asumattomana
ja entisen näköisenä. Peräseinällä oli tuttu vuode, seinillä olivat hyllyt
täynnä hurskaita kirjoja, se maalaustelinekin, jonka ääressä hän
ensinnä oli koettanut kankaalle kuvata aatteita, seisoi nurkassa
rikkoutuneena ja tomunpeittämänä. Ikkunan edustalla oli vanha
kirkkomaa, hän näki sen etäämpänä viheriöivän ja aurinko paistoi
sen korkeitten puitten välistä, hän näki haudan, missä isä ja äiti
yhdessä makasivat, ja kirkontorni viittasi ylös taivaaseen, ihmisten
toiveiden vertauskuvana, kun he maan multaan kätkivät rakkaansa.
Hänen korviinsa kaikuivat kirkonkellot kuin pyhäpäivänä, kauaksi
pakenivat kaikki huolen ja kauhun näyt, jotka olivat häntä
värisyttäneet ja vainonneet, nuoruus, poika-aika, lapsuus tuli takaisin
viattomine haluineen ja toiveineen, hän oli lankevinaan polvilleen
rukoilemaan. Hän heräsi — heräsi autuaissa kyyneleissä, hän tunsi,
että haamu oli ainiaaksi paennut. Hän katsoi ympärilleen — Zanoni
oli mennyt. Pöydällä seisoi paperilla nämä rivit, muste oli vielä
kostea:

"Minä keksin keinot sinun pakomatkaasi. Illan tullen, kun kello lyö
yhdeksän, odottaa sinua pursi talosi edustalla, laivuri vie sinut
turvapaikkaan, missä voit levollisesti viipyä, kunnes kauhunaika, joka
lähenee loppuaan, on ohi. Älä ajattele enää sitä aistillista lempeä,
joka on sinua vietellyt ja melkein tehnyt sinusta lopun. Se petti
sinua. Turvallisesti sinä pääset maahasi takaisin — pitkät vuodet on
sinulla vielä aikaa muistella menneisyyttä ja sovittaa sitä.
Tulevaisuudessa olkoot unelmat oppaanasi ja kyyneleesi uuden
syntymisen kasteena."

Englantilainen totteli kirjeen neuvoja ja löysi ne tosiksi.


X LUKU.

"Miksi ihmettelet, että minulla on niin monta muotoa samassa


ruumiissa?"

Propertius.

Zanoni Mejnourille.

"Viola on eräässä heidän vankilassaan — noissa armottomissa


vankiloissa. Se on Robespierren käsky — minä olen etsinyt syyn
jälkiä Glyndoniin asti. Tämän siis aiheutti se pelottava yhteys heidän
kohtalojensa välillä, jota en saanut ilmi vaan joka itse Glyndonin
peitti samaan pilveen, mikä Violankin salasi. Vankeudessa — ja
vankeus on haudan portti. Hänen tutkintonsa ja ehdoton tuomionsa,
joka sellaisissa tutkimuksissa aina seuraa, tapahtuu kolmen päivän
päästä. Tyranni on määrännyt kaikkien murhanhankkeittensa
päiväksi 10 päivän Thermidor-kuuta. Samalla kuin viattomien
ihmisten kuolema panee kaupungin kauhistumaan, niin hänen
asemiehensä surmaavat hänen omat vihollisensa. On ainoastaan yksi
toivo jälellä — että se voima, joka nyt tuomitsee tuomitsijan, sallisi
minun olla välikappaleena hänen sortumisensa avustamiseksi. Vain
kaksi päivää jälellä — kaksi päivää! Vaikka minulla on tarjona niin
suunnaton ajan rikkaus, en näe muuta kuin kaksi päivää, kaikki sen
takana on pimeyttä ja autiutta. Vielä minä voisin hänet pelastaa.
Tyrannin pitää kukistua päivää ennen kuin hän on päättänyt
toimeenpanna murhat. Ensimäisen kerran minä sekaannun ihmisten
taisteluihin ja riitoihin ja sydämeni havahtaa epätoivostaan
asestettuna ja taisteluun valmiina."

Väkijoukko oli kokoontunut Rue St. Honorén ympärille — nuori


mies vangittiin Robespierren käskystä. Hänet tunnettiin Tallienin,
konventin vastustuspuolueen johtajan palvelijaksi. Tähän saakka
tyranni ei vielä ollut uskaltanut Tallienia ahdistaa ja sentähden tämä
tapaus synnytti enemmän kiihtymystä kuin muuten näin tavallinen
asia hirmuhallituksen aikana. Väkijoukossa oli monta Tallienin
ystävää, monta tyrannin vihollista, monta, jotka olivat väsyneet
katselemaan, kuinka tiikeri uhrin toisensa jälkeen riisti luolaansa
raadeltavaksi. Pahaenteistä murinaa kuului, raivoisat silmät katsoivat
oikeudenpalvelijoihin, kun he tarttuivat uhriin, ja vaikkei uskallettu
suoraan vastustaa, niin taaimmaiset tyrkkivät etumaisina olevia ja
tukkivat tien vangilta ja vangitsijoilta. Nuori mies ponnisteli rajusti
päästäkseen irti ja pääsi viimein tavattomalla ponnistuksella
vartijoittensa käsistä. Väkijoukko antoi tietä ja sulkeutui hänen
jälkeensä suojelevasti, samalla kuin hän syöksyi heidän keskeltään
pakoon. Mutta äkkiä kuului läheltä hevosenkavioitten ääntä — villi
Henriot ja hänen joukkonsa hyökkäsivät kansanjoukkoon. Väki antoi
pelästyen tietä ja vankiin tarttuivat uudestaan diktaattorin
käskyläiset. Sillä hetkellä kuiskasi ääni vangitulle: "Sinulla on kirje, ja
jos se sinulta löytyy, menee viimeinen toivosi. Anna se minulle. Minä
vien sen Tallienille." Vangittu kääntyi hämmästyen, luki jotakin
rohkaisevaa muukalaisen silmistä, joka häntä puhutteli. Hevosmiehet
olivat samassa lähellä, Jakobini, joka oli vankiin tarttunut, päästi
hetkeksi irti välttääkseen hevosten kavioita, siinä silmänräpäyksessä
tarjoutui tilaisuus, ja muukalainen katosi kirjeen kanssa.

Tallienin taloon olivat tyrannin pääviholliset kokoontuneet.


Yhteinen vaara oli rakentanut lujan ystävyyden. Kaikki puolueet
laskivat ajaksi syrjään kinastelunsa noustakseen yhdessä sitä
kauheata miestä vastaan, joka kaikkien puolueitten yli marssi
veriselle valtaistuimelleen. Siellä oli rohkea Lecointre, vannoutunut
vihollinen, siellä oli ryömivä Barrère, pelkurien sankari, joka tahtoi
sovittaa kaikki äärimmäisyydet, siellä oli Barras, tyyni ja hillitty, Collot
d'Herbois, joka uhkui vihaa ja kostoa eikä nähnyt, että ainoastaan
Robespierren rikokset estivät hänen omia rikoksiansa näkymästä.

Neuvosto oli kiihtynyt ja epäröivä. Kauhu, jota Robespierren


ainainen menestys ja ihmeellinen tarmokkuus synnytti, piti vielä
useimpia vallassaan. Tallien, jota tyranni enimmän pelkäsi ja joka
yksin saattoi antaa pontta ja perää ja suuntaa monille ristiriitaisille
intohimoille, oli liian tahrainen omien julmuuksiensa muistosta, että
olisi voinut olla häpeemättä asemaansa säälin edustajana. "On
totta", hän sanoi, kun Lecointre oli pitänyt innostuttavan puheen,
"että Vallananastaja uhkaa meitä kaikkia. Mutta vielä häntä rakastaa
yhteinen kansa — vielä jakobinit häntä kannattavat, parempi on
jättää vihollisuudet siksi kun aika on kypsyneempi. Epäonnistunut
yritys on samaa kuin joutuminen suoraa päätä, kädet ja jalat
sidottuina, guillotiinille. Päivä päivältä täytyy hänen valtansa
heikontua. Toistaiseksi jättäminen on meidän paras —." Samalla kuin
hän näin puhui ja valoi vettä tulen sammutteeksi, ilmotettiin, että
eräs muukalainen pyysi heti tavata häntä puhuakseen asiasta, joka
ei sietänyt viivytystä.
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

ebooknice.com

You might also like