问题描述
我建立一个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)
{
}