PineBlog v2
PineBlog has been updated to version 2. This new release adds the following new features and improvements:
MongoDb
can now be used a data source- Extended Markdown support
- Now targeting
net5.0
andnetcoreapp3.1
- Removed the
_ValidationScriptsPartial
fromOpw.PineBlog.RazorPages
- Removed dependencies on
Opw.Core
andOpw.EntityFramework
Using MongoDb
When you want to use MongoDb as your database, then you don't use the Opw.PineBlog
metapackage but you need to install the required packages individually.
Opw.PineBlog.MongoDb package The PineBlog data provider that uses MongoDb.
Opw.PineBlog.RazorPages package The PineBlog UI using ASP.NET Core MVC Razor Pages.
Opw.PineBlog.Core package The PineBlog core package. This package is a dependency for
Opw.PineBlog.RazorPages
andOpw.PineBlog.MongoDb
.
Startup
You add the PineBlog services and the Razor Pages UI in the Startup.cs of your application.
public void ConfigureServices(IServiceCollection services)
{
...
services.AddPineBlogCore(Configuration);
services.AddPineBlogMongoDb(Configuration);
services.AddRazorPages().AddPineBlogRazorPages();
// or services.AddMvcCore().AddPineBlogRazorPages();
// or services.AddMvc().AddPineBlogRazorPages();
...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Make sure you enable static file serving
app.UseStaticFiles();
...
app.UseEndpoints(endpoints =>
{
// make sure to add the endpoint mapping for both RazorPages and Controllers
endpoints.MapRazorPages();
endpoints.MapControllers();
});
...
}
NOTE: Make sure you enable static file serving app.UseStaticFiles();
, to enable the serving of the css and javascript from the Opw.PineBlog.RazorPages
packages.
Configuration
And a few properties need to be configured before you can run your web application with PineBlog.
{
"ConnectionStrings": {
"MongoDbConnection": "inMemory" // MongoDb connection string
},
"PineBlogOptions": {
"Title": "PineBlog",
"Description": "A blogging engine based on ASP.NET Core MVC Razor Pages and MongoDb",
"ItemsPerPage": 5,
"CreateAndSeedDatabases": true,
"ConnectionStringName": "MongoDbConnection",
"MongoDbDatabaseName": "pineblog-db",
"AzureStorageConnectionString": "UseDevelopmentStorage=true",
"AzureStorageBlobContainerName": "pineblog",
"FileBaseUrl": "http://127.0.0.1:10000/devstoreaccount1"
}
}
Blog Settings ConfigurationProvider
To be able to update the blog settings from the admin pages, you need to add the PineBlog IConfigurationProvider
s to the
IConfigurationBuilder
in the Program.cs
. Add config.AddPineBlogMongoDbConfiguration(reloadOnChange: true);
to ConfigureAppConfiguration(..)
on the IWebHostBuilder
.
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureAppConfiguration((hostingContext, config) => {
config.AddPineBlogMongoDbConfiguration(reloadOnChange: true);
});
Markdown support
Markdig is used as the Markdown processor and the following markdown features are enabled by default:
If you want or require more advanced Markdown features, you can enable those by overriding the ~/Areas/Blog/Pages/Shared/_Post.cshtml
partial (see source).
Tables
How to create the following table with styling, using pipe tables
and generic attributes
.
Company | Contact | Country |
---|---|---|
Alfreds Futterkiste | Maria Anders | Germany |
Centro comercial Moctezuma | Francisco Chang | Mexico |
Ernst Handel | Roland Mendel | Austria |
Island Trading | Helen Bennett | UK |
{.table .table-striped}
|Company|Contact|Country|
|-|-|-|
|Alfreds Futterkiste|Maria Anders|Germany|
|Centro comercial Moctezuma|Francisco Chang|Mexico|
|Ernst Handel|Roland Mendel|Austria|
|Island Trading|Helen Bennett|UK|
Using CSS
How to create the following blockquote with an bootstrap info-alert style, using generic attributes
.
Normally the dangers inherent in the diverse hardware environment enhances the efficiency of the inductive associative dichotomy on a strictly limited basis.
{.alert .alert-info}
> Normally the dangers inherent in the diverse hardware environment enhances the efficiency of the inductive associative dichotomy on a strictly limited basis.
.Net 5.0
The PineBlog packages are now targeting targeting net5.0
and netcoreapp3.1
.
Where can I get it?
You can install the Opw.PineBlog metapackage from the console.
> dotnet add package Opw.PineBlog
The Opw.PineBlog metapackage includes the following packages.
Opw.PineBlog.EntityFrameworkCore package The PineBlog data provider that uses Entity Framework Core.
Opw.PineBlog.RazorPages package The PineBlog UI using ASP.NET Core MVC Razor Pages.
Opw.PineBlog.Core package The PineBlog core package. This package is a dependency for
Opw.PineBlog.RazorPages
andOpw.PineBlog.EntityFrameworkCore
.Opw.PineBlog.MongoDb package The PineBlog data provider that uses MongoDb.
Demo website
Check out the PineBlog demo website. You can write and publish posts, upload files and test application before install. And no worries, it is just a sandbox and will clean itself.
Url: pineblog.azurewebsites.net
Username: pineblog@example.com
Password: demo
HttpExceptions v3
HttpExceptions has been updated to version 3 (3.0.2). This new release adds the following new features:
- New options to override the
Exception*Mapping
andHttpContext*Mapping
methods on the mappers - Expose serialization helper methods in the
Opw.HttpExceptions.AspNetCore
package Opw.HttpExceptions.AspNetCore
package is now targetingnet50
and.NETCoreApp 3.1
Override the *Mapping methods
New options to override the Exception*Mapping
and HttpContext*Mapping
methods on the mappers using a Func have been added.
You can inject your own mappings for the ProblemDetails
properties using functions on the HttpExceptionsOptions
, or by creating your own IExceptionMapper
and/or IHttpResponseMapper
. If you inject your own function that will be tried first, and if no result is returned the defaults will be used.
In the following example we will create a custom function mapping the ProblemDetails.Type
property. By default the ProblemDetails.Type
property will be set by:
- Either the
Exception.HelpLink
or the HTTP status code information link. - Or the
DefaultHelpLink
will be used. - Or an URI with the HTTP status name ("error:[status:slug]") will be used.
When the ExceptionTypeMapping
or HttpContextTypeMapping
are set the result of those functions will be tried first, if no result is returned the defaults will be used.
mvcBuilder.AddHttpExceptions(options =>
{
ExceptionTypeMapping = exception => {
// This is a example, you can implement your own logic here.
return "My Exception Type Mapping";
},
HttpContextTypeMapping = context => {
// This is a example, you can implement your own logic here.
return "My HttpContext Type Mapping";
}
});
Serialization helpers
Serialization helper methods added to the Opw.HttpExceptions.AspNetCore
package.
Serialize the HTTP content to ProblemDetails.
ProblemDetails problemDetails = ((HttpContent)response.Content).ReadAsProblemDetails();
Try to get the exception details from the ProblemDetails.
SerializableException exception;
((ProblemDetails)problemDetails).TryGetExceptionDetails(out exception);
Try to get the errors dictionary from the ProblemDetails.
var IDictionary<string, object[]> errors;
((ProblemDetails)problemDetails).TryGetErrors(out errors);
.Net 5.0
The Opw.HttpExceptions.AspNetCore
package is now targeting net50
and .NETCoreApp 3.1
.
Where can I get it?
The code can be found on GitHub at: github.com/ofpinewood/http-exceptions. And there is also a sample project you can have a look at.
You can install the Opw.HttpExceptions and Opw.HttpExceptions.AspNetCore NuGet packages from the package manager console:
PM> Install-Package Opw.HttpExceptions
PM> Install-Package Opw.HttpExceptions.AspNetCore
PineBlog is upgraded to .Net Core 3.0
In the latest release of PineBlog I've added support for .Net Core 3.0 (and 3.1-preview3) and removed support for .Net Core 2.2. There are no mayor changes in the package. But since .Net Core 3.x has some changes in the Startup.cs
, you might need to update the registration of PineBlog there.
public void ConfigureServices(IServiceCollection services)
{
...
services.AddPineBlog(Configuration);
// when you want to add just the bare minimum
services.AddRazorPages().AddPineBlogRazorPages();
// or you can use the more familiar ways from .Net Core 2.x
// or services.AddMvcCore().AddPineBlogRazorPages();
// or services.AddMvc().AddPineBlogRazorPages();
...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseEndpoints(endpoints =>
{
// make sure to add the endpoint mapping for both RazorPages and Controllers
endpoints.MapRazorPages();
endpoints.MapControllers();
});
...
}
For more information, please check PineBlog on GitHub.