在ASP.Net Core 5 (Razor)中,可以通过中间件来获取页面模型的类型。中间件是ASP.Net Core应用程序处理请求的组件,它可以在请求到达控制器之前或之后执行一些操作。
要从中间件中获取页面模型的类型,可以使用HttpContext对象的GetRouteData()方法来获取当前请求的路由数据。然后,可以通过路由数据中的"page"键来获取当前页面的路径。接下来,可以使用Razor页面编译器来编译页面,并通过反射获取页面模型的类型。
以下是一个示例代码:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Reflection;
namespace YourNamespace
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddRazorPagesOptions(options =>
{
options.Conventions.Add(new PageModelTypeConvention());
});
}
public void Configure(IApplicationBuilder app)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
var pageModelType = context.GetRouteData().Values["page"]?.ToString();
var pageModel = GetPageModelType(pageModelType);
await context.Response.WriteAsync($"Page Model Type: {pageModel}");
});
});
}
private Type GetPageModelType(string pageModelType)
{
var assembly = Assembly.GetExecutingAssembly();
var razorPagesFeature = new ViewsFeature();
var pagePath = $"/Pages/{pageModelType}.cshtml";
var razorViewEngine = new RazorViewEngine(
new DefaultPageFactoryProvider(razorPagesFeature),
new DefaultViewLocationCache(razorPagesFeature));
var viewEngineResult = razorViewEngine.GetView(null, pagePath, false);
var view = viewEngineResult.View;
var pageTypeInfo = view.GetType().GetTypeInfo();
var pageModelTypeInfo = pageTypeInfo.GetProperty("ModelTypeInfo").GetValue(view) as TypeInfo;
var pageModelType = pageModelTypeInfo.AsType();
return pageModelType;
}
}
public class PageModelTypeConvention : IPageRouteModelConvention
{
public void Apply(PageRouteModel model)
{
var pageModelType = model.ViewEnginePath.Replace("/Pages/", "").Replace(".cshtml", "");
model.RouteValues["page"] = pageModelType;
}
}
}
在上述示例中,我们定义了一个Startup类,并在ConfigureServices方法中添加了Razor页面选项。然后,在Configure方法中使用中间件来处理请求,并通过HttpContext对象获取当前页面的路径。接下来,我们使用Razor页面引擎来编译页面,并通过反射获取页面模型的类型。最后,将页面模型类型返回给客户端。
请注意,这只是一个示例代码,具体实现可能会因应用程序的需求而有所不同。此外,为了使示例代码更简洁,省略了错误处理和其他辅助方法的实现。
希望这个答案能够满足你的需求。如果你有任何其他问题,请随时提问。
领取专属 10元无门槛券
手把手带您无忧上云