Git Product home page Git Product logo

dammitjanet / razor.templating.core Goto Github PK

View Code? Open in Web Editor NEW

This project forked from soundaranbu/razor.templating.core

0.0 0.0 0.0 2.4 MB

Razor Templating Engine to render Razor Views(.cshtml files) to String in Console, Web, Service, Desktop workloads in .NET Core 3+

Home Page: https://soundaranbu.medium.com/render-razor-view-cshtml-to-string-in-net-core-7d125f32c79

License: MIT License

C# 2.13% HTML 97.87%

razor.templating.core's Introduction

Razor.Templating.Core

Build+Test Nuget Downloads Coverage

Using Razor for HTML templating was never been so easy like this. Render your .cshtml files into string easily using this library.

This project makes use of Razor SDK for precompiling the views.

Supported Application Types

.NET Core 3.0 .NET Core 3.1 .NET 5 > .NET 6
Preferred Version v1.6.0 v1.6.0 v1.6.0 2.0.0
Console
Api
Mvc
Worker Service
WPF
WinForms
Azure Functions

Supported View Features

MVC Razor View Features
ViewModel
ViewBag
ViewData
Layouts
ViewStarts
ViewImports
Partial Views
Tag Helpers
View Components (.NET 5 +)
Dependency Injection into Views
@Url.ContentUrl**
@Url.RouteUrl**

**Contributors are welcome who can help to enable these unsupported features.

Applications

  • Email Templating
  • Report Generation & more

Installing Nuget Package

This library is available as Nuget package

Using .NET CLI

dotnet add package Razor.Templating.Core

Using Package Reference .csproj

<PackageReference Include="Razor.Templating.Core" Version="2.0.0" />

Usage - Render View With Layout

To render a view with layout, model, viewdata or viewbag, then call the RenderAsync() on the RazorTemplateEngine static class

RenderAsync() method

using Razor.Templating.Core;

var model = new ExampleModel()
{
    PlainText = "This text is rendered from Razor Views using Razor.Templating.Core",
    HtmlContent = "<em>You can use it to generate email content, report generation and so on</em>"
};

// Both ViewBag and ViewData should be added to the same dictionary. 
var viewDataOrViewBag = new Dictionary<string, object>();
// ViewData is same as mvc
viewDataOrViewBag["Value1"] = "1";

// ViewBag.Value2 can be written as below. There's no change on how it's accessed in .cshtml file
viewDataOrViewBag["Value2"] = "2";

var html = await RazorTemplateEngine.RenderAsync("/Views/ExampleView.cshtml", model, viewDataOrViewBag);

Before applying this code, follow this article for sample implementation: https://medium.com/@soundaranbu/render-razor-view-cshtml-to-string-in-net-core-7d125f32c79

Render View Without Layout

In case if there's a need to render a view without layout, use RenderParitalAsync() method.

RenderPartialAsync() method

var html = await RazorTemplateEngine.RenderPartialAsync("/Views/ExampleView.cshtml", model, viewDataOrViewBag);

Render Views Without Throwing Exception

There are TryRenderAsync() and TryRenderPartialAsync methods which will not throw exception if the view doesn't exist. Instead they return a tuple to indicate whether the view exists and the rendered string.

TryRenderAsync() method

var (viewExists, renderedView) = await engine.TryRenderAsync("~/Views/Feature/ExampleViewWithoutViewModel.cshtml");

TryRenderPartialAsync() method

var (viewExists, renderedView) = await engine.TryRenderPartialAsync("~/Views/_ExamplePartialView.cshtml", model);

Razor Views in Library

We can organize the Razor view files(.cshtml) in a separate shared Razor Class Libary(RCL). Please find a sample library here

The Razor Class Library's .csproj file should look something like below. Whereas, AddRazorSupportForMvc property is mandatory.

Also, RCL should be referenced by the main project or where any of the rendering methods like RazorTemplateEngine.RenderAsync() are invoked.

<Project Sdk="Microsoft.NET.Sdk.Razor">
  <PropertyGroup>
    <TargetFrameworks>net6.0</TargetFrameworks>
    <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
  </PropertyGroup>

  <ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>
</Project>

Dependency Injection

Dependencies can be injected directly into views using @inject in .csthml file. Refer sample application here

In ASP.NET Core, add dependency like below in Startup.cs -> ConfigureServices

...
services.AddTransient<ExampleService>();
//add after registering all the dependencies
services.AddRazorTemplating();

or in console or other applications, add as below

using Microsoft.Extensions.DependencyInjection;

// Add dependencies to the service collection
var services = new ServiceCollection();
services.AddTransient<ExampleService>();
// Add RazorTemplating after registering all dependencies
// this is important for the razor template engine to find the injected services
services.AddRazorTemplating(); 

Once the dependencies are registered, we can use either one of these ways:

Using RazorTemplateEngine static class

var html = await RazorTemplateEngine.RenderAsync("~/Views/ExampleViewServiceInjection.cshtml");

Using IRazorTemplateEngine

  • Instead of using the RazorTemplateEngine static class, it's also possible to use the IRazorTemplateEngine interface to inject dependency directly into the constructor.
public class MyService {
    private readonly IRazorTemplateEngine _razorTemplateEngine;

    public MyService (IRazorTemplateEngine razorTemplateEngine)
    {
        _razorTemplateEngine = razorTemplateEngine;
    }

    public async Task Index()
    {
        var renderedView = await _razorTemplateEngine.RenderAsync("/Views/Home/Index.cshtml");
        // do something with renderedView
    }
}

How to render razor views from absolute path

We can make use of ASP.NET Core's inbuilt RazorRuntimeCompilation to render any .cshtml inside or outside of the project.

As of v1.7.0+, we can achieve this as below:

using Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Razor.Templating.Core;

var services = new ServiceCollection();
services.AddMvcCore().AddRazorRuntimeCompilation();
services.Configure<MvcRazorRuntimeCompilationOptions>(opts =>
{
    opts.FileProviders.Add(new PhysicalFileProvider(@"D:\PathToRazorViews")); // This will be the root path
});
services.AddRazorTemplating();

var html = await RazorTemplateEngine.RenderAsync("/Views/Home/Rcl.cshtml"); // relative path to the root

Please note this may become slightly better in the future versions of our library.

Note:

  • Please ensure that the views path is always unique among all the shared template projects.

Sample Applications

Please find the sample applications here

Support

If you find this helpful, consider supporting the development of this library by sponsoring one or more coffee ;) Thanks!

References:

Thanks to all the great articles and projects which helped to bring this library out!

razor.templating.core's People

Contributors

soundaranbu avatar pbolduc avatar dirvo avatar mobiletonster avatar litan1106 avatar soundarrbt avatar dependabot[bot] avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.