using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.Mvc.Razor;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace PocoDemo
{
public class MultiTenantViewLocationExpander : IViewLocationExpander
{
public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
{
if (!context.Values.ContainsKey("tenant")|| string.IsNullOrWhiteSpace(context.Values["tenant"]))
{
return viewLocations;
}
var tenant = context.Values["tenant"];
var views = viewLocations.Select(f => f.Replace("/Views", "/Views/" + tenant + "/"))
.Concat(viewLocations)
.ToList();
return views;
}
public void PopulateValues(ViewLocationExpanderContext context)
{
var tenant = context.ActionContext.HttpContext.Request.GetDisplayUrl();
context.Values["tenant"] = "contoso";
}
}
}
/********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
namespace PocoDemo
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
//增加视图扩展器服务
services.AddMvc().AddRazorOptions(options =>
{
options.ViewLocationExpanders.Add(new MultiTenantViewLocationExpander());
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//app.UseMvcWithDefaultRoute();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "demo",
template: "go/to/{city}/for/{days}/days",
defaults: new { controller="Input",action="Go"
});
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
}
}