This is an ASP.NET Core helper library targeting ASP.NET Core 5.0. It contains extensions and utilities I've needed to use across my different ASP.NET Core projects. Since it is based on my needs it is opinionated and I do make changes to it from time to time, generally by adding new features or updating the existing ones, but sometimes by removing features. So it is a little volatile that way, but I'd be happy if you gave it a shot anyway.
- Extensions
- Middlewares
- Miscellaneous
There is a extension method for IServiceCollection called AddArex388() which you can use for basic configuration to enable any of the following:
UseFeaturesto enable theFeaturesViewLocationExpanderUseIdentityProviderto configure theIdentityProviderto be injectableUseSimpleSlugifyParameterTransformerto enable theSimpleSlugifyParameterTransformer
Here's the Startup code:
public void ConfigureServices(
IServiceCollection services) {
services.AddArex388(
o => {
o.UseFeatures = true;
o.UseIdentityProvider = true;
o.UseSimpleSlugifyParameterTransformer = true;
});
}The Controller and HttpRequest classes have been extended with the following extensions:
GetUserId()- returns the user's id claim value as anint.GetValue(string claimType)- returns a claim value as a string.
NOTE: These extensions are highly opinionated about the controller and action structure of the app.
RedirectToDefault()- returns aRedirectToAction()result for the Default view.RedirectToEdit<T>(T id)- returns aRedirectToAction()result for the Edit view passing in theid.RedirectToGone()- returns aRedirectToAction()result for the Gone view.RedirectToReferrer()- returns aRedirect()result with the request's referrer.
StringJoin<T>(string? separator)- returns a concatenated string of an enumerable with the specified separator.
GetReferrer()- returns the request's referrer from the referrer header, if any.
GetDictionary()- returns anIDictionary<string, string>containing any model errors.
HasValue()- returns true or false if the string not null or empty.
The following middlewares are available.
The HtmlMinifierMiddleware intercepts the response being returned and minifies the HTML using the HtmlAgilityPack. I recommend using it right after the call to UseStaticFiles.
public void Configure(
IApplicationBuilder app) {
app.UseStaticFiles();
app.UseHtmlMinifier();
}Using Gulp I always have my CSS and JS files bundled into a single minified file. That works great, but it always felt like it wasn't complete. I really wanted to get Gzip and Brottli versions of the minified file and try to serve those first before falling back to the plain minified version. After a bit of tinkering I got Gulp to generate those as well, but I needed a way to intercept the call to the minified file and return either the Gzip or Brottli versions.
The PreCompressedStaticFilesMiddleware was born out of that need. It intercepts requests to CSS and JS files and, based on the accept encoding and existence of the files, will return either the Gzip or Brottli versions or fallback to the minified version.
public void Configure(
IApplicationBuilder app) {
app.UsePreCompressedStaticFiles();
app.UseStaticFiles();
}You must also add the following to your web.config to make it all work.
<system.webServer>
<httpCompression>
<staticTypes>
<add mimeType="text/css" enabled="false"/>
<add mimeType="text/javascript" enabled="false"/>
</staticTypes>
</httpCompression>
</system.webServer>The SitemapMiddleware is a placeholder middleware for intercepting requests to /sitemap.xml. There are two components to it. First you need to have a class that implements ISitemapServices and another class that inherits from SitemapMiddlewareBase and implements the InvokeInternalAsync() method.
I usually pass in my DbContext instance and proceed to build out the XML that will be returned based on the needs of the application.
public void Configure(
IApplicationBuilder app) {
app.UseSitemap<SitemapMiddleware>();
}The following miscellaneous features are available.
The FeaturesViewLocationExpander is a location expander for the Razor View Engine. It clears all currently registered location expanders, and adds itself. The expander follows the Features folders structure as described by Jimmy Bogard's Vertical Slices Architecture.
The IdentityProvider is a small helper class to access identity information for a currently authenticated user. By default it only provides access to the UserId (as an int) and IsAuthenticated properties.
You can extend it by inheriting from it, which gives you access to the IHttpContextAccessor from which you can then extract identity claims using the GetValue() extension method from ClaimsPrincipal:
public sealed class MyIdentityProvider :
IdentityProvider {
public MyIdentityProvider(
IHttpContextAccessor accessor) : base(accessor) {
}
public string UserLovesArex388 => Accessor.HttpContext.User.GetValue("LovesArex388");
}The SimpleSlugifyParameterTransformer is, as the name implies, a very simple IOutboundParameterTransformer that slugifies the action's name by taking it's camel cased version and kebaberizing it.
The TokenProvider is a small helper class for generating random strings. It is not secure by any means, but works fine for temporary passwords or validation tokens.
var token = TokenProvider.Create(128);