Razor views, pages, controllers, page models, [View components](xref:mvc/views/view-components), and data models can be built into a Razor Class Library (RCL). The RCL can be packaged and reused. Applications can include the RCL and override the views and pages it contains. When a view, partial view, or Razor Page is found in both the web app and the RCL, the Razor markup (*.cshtml* file) in the web app takes precedence.
[View or download sample code](https://github.com/aspnet/Docs/tree/master/aspnetcore/razor-pages/ui-class/samples) ([how to download](xref:tutorials/index#how-to-download-a-sample))
* Name the library (for example, "RazorClassLib") > **OK**. To avoid a file name collision with the generated view library, ensure the library name doesn't end in `.Views`.
For more information, see [dotnet new](/dotnet/core/tools/dotnet-new). To avoid a file name collision with the generated view library, ensure the library name doesn't end in `.Views`.
The ASP.NET Core templates assume the RCL content is in the *Areas* folder. See [RCL Pages layout](#afs) to create a RCL that exposes content in `~/Pages` rather than `~/Areas/Pages`.
* NuGet package. See [Creating NuGet packages](/nuget/create-packages/creating-a-package) and [dotnet add package](/dotnet/core/tools/dotnet-add-package) and [Create and publish a NuGet package](/nuget/quickstart/create-and-publish-a-package-using-visual-studio).
* *{ProjectName}.csproj*. See [dotnet-add reference](/dotnet/core/tools/dotnet-add-reference).
## Walkthrough: Create a Razor Class Library project and use from a Razor Pages project
You can download the [complete project](https://github.com/aspnet/Docs/tree/master/aspnetcore/razor-pages/ui-class/samples) and test it rather than creating it. The sample download contains additional code and links that make the project easy to test. You can leave feedback in [this GitHub issue](https://github.com/aspnet/Docs/issues/6098) with your comments on download samples versus step-by-step instructions.
If you haven't downloaded the completed app and would rather create the walkthrough project, skip to the [next section](#create-a-razor-class-library).
# [Visual Studio](#tab/visual-studio)
Open the *.sln* file in Visual Studio. Run the app.
# [.NET Core CLI](#tab/netcore-cli)
From a command prompt in the *cli* directory, build the RCL and web app.
``` CLI
dotnet build
```
Move to the *WebApp1* directory and run the app:
``` CLI
dotnet run
```
------
Follow the instructions in [Test WebApp1](#test)
## Create a Razor Class Library
In this section, a Razor Class Library (RCL) is created. Razor files are added to the RCL.
# [Visual Studio](#tab/visual-studio)
Create the RCL project:
* From the Visual Studio **File** menu, select **New** > **Project**.
`@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers` is required to use the partial view (`<partialname="_Message"/>`). Rather than including the `@addTagHelper` directive, you can add a *_ViewImports.cshtml* file. For example:
``` CLI
dotnet new viewimports -o RazorUIClassLib/Areas/MyFeature/Pages
```
For more information on viewimports, see [Importing Shared Directives](xref:mvc/views/layout#importing-shared-directives)
* Build the class library to verify there are no compiler errors:
``` CLI
dotnet build RazorUIClassLib
```
The build output contains *RazorUIClassLib.dll* and *RazorUIClassLib.Views.dll*. *RazorUIClassLib.Views.dll* contains the compiled Razor content.
### Use the Razor UI library from a Razor Pages project
When a view, partial view, or Razor Page is found in both the web app and the Razor Class Library, the Razor markup (*.cshtml* file) in the web app takes precedence. For example, add *WebApp1/Areas/MyFeature/Pages/Page1.cshtml* to WebApp1, and Page1 in the WebApp1 will take precedence over Page1in the Razor Class Library.
In the sample download, rename *WebApp1/Areas/MyFeature2* to *WebApp1/Areas/MyFeature* to test precedence.
Copy the *RazorUIClassLib/Areas/MyFeature/Pages/Shared/_Message.cshtml* partial view to *WebApp1/Areas/MyFeature/Pages/Shared/_Message.cshtml*. Update the markup to indicate the new location. Build and run the app to verify the app's version of the partial is being used.
To reference RCL content as though it is part of the web app's Pages folder, create the RCL project with the following file structure:
* *RazorUIClassLib/Pages*
* *RazorUIClassLib/Pages/Shared*
Suppose *RazorUIClassLib/Pages/Shared* contains two partial files, *_Header.cshtml* and *_Footer.cshtml*. The <partial> tags could be added to *_Layout.cshtml* file: