路由传统的URL与.NET核心剃刀网页查询参数

问题描述

我建立一个ASP.NET核心5.0网络应用程序。它必须支持具有旧网址的用户,例如。 contoso.com/privacy.aspx?EmpNo=12&Date=2021-01-07

在URL应该被路由到像 contoso.com/privacy/12/2021-01-07

目前我在privacy.cshtml中有这个

@page "{id:int?}/{date:datetime?}"
@model PrivacyModel
@{
    ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"] @RouteData.Values["id"] @RouteData.Values["date"]</h1>

在我Startup.cs我已经得到了这个工作。

    public void Configure(IApplicationBuilder app,IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
            app.UseDeveloperExceptionPage();
        else
            app.UseExceptionHandler("/Error");

        app.UseStaticFiles();
        app.UseRouting();
        app.UseAuthorization();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();

            endpoints.MapGet("privacy.aspx",async context =>
            {
                await Task.Run(() => context.Response.Redirect("/privacy"));
            });
        });
    }

此仅重定向privacy.aspx到/隐私。 当我尝试添加查询参数,它失败:RoutePatternException:字面节“privacy.aspx EMPNO =?”是无效的。文字部分不能包含“?”字符。

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages()
            .AddRazorPagesOptions(options =>
            {
                options.Conventions.AddPageRoute("/privacy","privacy.aspx?EmpNo={id}&Date={date}");
            });
    }

解决方法

好的,经过反复试验,这很简单:

endpoints.MapGet("privacy.aspx",async context =>
            {
                var query = context.Request.QueryString;
                await Task.Run(() => context.Response.Redirect("/privacy" + query.Value));
            });

然后就可以在get方法中获取值了:

 public void OnGet([FromQuery(Name = "EmpNo")] string empNo,[FromQuery(Name = "Date")] DateTime date)
    {
        
    }