Browse Source

Merge pull request #15478 from abpframework/EngincanV/blogging-route-constraint

Blogging: Conventional route matching
pull/15483/head
Enis Necipoglu 4 years ago
committed by GitHub
parent
commit
26e700bfdb
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 35
      modules/blogging/src/Volo.Blogging.Web/BloggingRouteConstraint.cs
  2. 6
      modules/blogging/src/Volo.Blogging.Web/BloggingUrlOptions.cs
  3. 25
      modules/blogging/src/Volo.Blogging.Web/BloggingWebModule.cs

35
modules/blogging/src/Volo.Blogging.Web/BloggingRouteConstraint.cs

@ -0,0 +1,35 @@
using System;
using System.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Options;
namespace Volo.Blogging;
public class BloggingRouteConstraint : IRouteConstraint
{
protected BloggingUrlOptions BloggingUrlOptions { get; }
public BloggingRouteConstraint(IOptions<BloggingUrlOptions> bloggingUrlOptions)
{
BloggingUrlOptions = bloggingUrlOptions.Value;
}
public virtual bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
{
if (BloggingUrlOptions.RoutePrefix != "/" || !BloggingUrlOptions.IgnoredPaths.Any())
{
return true;
}
var displayUrl = httpContext.Request.GetDisplayUrl();
if (BloggingUrlOptions.IgnoredPaths.Any(path => displayUrl.Contains(path, StringComparison.InvariantCultureIgnoreCase)))
{
return false;
}
return true;
}
}

6
modules/blogging/src/Volo.Blogging.Web/BloggingUrlOptions.cs

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
namespace Volo.Blogging
{
@ -15,6 +16,11 @@ namespace Volo.Blogging
set => _routePrefix = value;
}
/// <summary>
/// Used to specify ignore paths if the route prefix is null or empty.
/// </summary>
public List<string> IgnoredPaths { get; } = new ();
private string GetFormattedRoutePrefix()
{
if (string.IsNullOrWhiteSpace(_routePrefix))

25
modules/blogging/src/Volo.Blogging.Web/BloggingWebModule.cs

@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.Mvc;
@ -61,6 +62,26 @@ namespace Volo.Blogging
.Extensions<PrismjsScriptBundleContributor>()
.Add<PrismjsScriptBundleContributorBloggingExtension>();
});
Configure<RouteOptions>(options =>
{
options.ConstraintMap.Add("blogNameConstraint", typeof(BloggingRouteConstraint));
});
Configure<BloggingUrlOptions>(options =>
{
var bundlingOptions = context.Services.GetRequiredService<IOptions<AbpBundlingOptions>>().Value;
if (bundlingOptions.Mode != BundlingMode.None)
{
options.IgnoredPaths.Add(bundlingOptions.BundleFolderName);
}
options.IgnoredPaths.AddRange(new[]
{
"error", "ApplicationConfigurationScript", "ServiceProxyScript", "Languages/Switch",
"ApplicationLocalizationScript"
});
});
Configure<RazorPagesOptions>(options =>
{
@ -70,8 +91,8 @@ namespace Volo.Blogging
var routePrefix = urlOptions.RoutePrefix;
options.Conventions.AddPageRoute("/Blogs/Posts/Index", routePrefix + "{blogShortName}");
options.Conventions.AddPageRoute("/Blogs/Posts/Detail", routePrefix + "{blogShortName}/{postUrl}");
options.Conventions.AddPageRoute("/Blogs/Posts/Index", routePrefix + "{blogShortName:blogNameConstraint}");
options.Conventions.AddPageRoute("/Blogs/Posts/Detail", routePrefix + "{blogShortName:blogNameConstraint}/{postUrl}");
options.Conventions.AddPageRoute("/Blogs/Posts/Edit", routePrefix + "{blogShortName}/posts/{postId}/edit");
options.Conventions.AddPageRoute("/Blogs/Posts/New", routePrefix + "{blogShortName}/posts/new");
});

Loading…
Cancel
Save