首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从ASP.Net Core5 (Razor)的中间件中获取页面模型的类型?

在ASP.Net Core 5 (Razor)中,可以通过中间件来获取页面模型的类型。中间件是ASP.Net Core应用程序处理请求的组件,它可以在请求到达控制器之前或之后执行一些操作。

要从中间件中获取页面模型的类型,可以使用HttpContext对象的GetRouteData()方法来获取当前请求的路由数据。然后,可以通过路由数据中的"page"键来获取当前页面的路径。接下来,可以使用Razor页面编译器来编译页面,并通过反射获取页面模型的类型。

以下是一个示例代码:

代码语言:txt
复制
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页面引擎来编译页面,并通过反射获取页面模型的类型。最后,将页面模型类型返回给客户端。

请注意,这只是一个示例代码,具体实现可能会因应用程序的需求而有所不同。此外,为了使示例代码更简洁,省略了错误处理和其他辅助方法的实现。

希望这个答案能够满足你的需求。如果你有任何其他问题,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券