剃刀页面自定义页面路由

时间:2019-09-01 16:26:26

标签: c# asp.net-core routing razor-pages

这个问题已经在较早的时候问过了,因为我是Razor Pages的新手,无法弄清楚我该怎么做(Silly)。因此,这里是:我有一个razor page,其中显示了一个数据列表,需要在其中进行页面路由或url,如下所示:

@foreach (var item in Model.Data)
{
  <a href="./search_details/id/@item.Id">@item.Name @item.City @item.State</a>
} 

非常简单,因此在Startup.cs中,我尝试执行以下操作使其生效。不幸的是失败了:

//This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddMvc();
    services.AddEntityFrameworkSqlite().AddDbContext<MyDbContext>();
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddMvc().AddRazorPagesOptions(options =>
    {
        //Here is the configured routing that I tried
        options.Conventions.AddPageRoute("/search_details", "/search_details/id");
    });
}

我想以 ./ search_details / id / 1002 返回url,并在后端执行此操作以获取查询字符串值:

string id = this.RouteData.Values["id"].ToString();

这是非常基本的,但是正如我所说的失败(失败意味着在后端,调试时查询字符串不会命中)。我还有另外一种情况,这件事现在最困扰我。我的要求是也隐藏页面名称。像这样:

localhost:8080/search_details/id/1002

收件人

localhost:8080/1002

有没有合适的方法可以实现这一目标?我知道这对其他目的是一种不好的做法,但就目前而言,我会同意的。

NB :除非有其他选择,否则我不愿意在客户端执行此操作。如果可能的话,最好在服务器端使用C#

1 个答案:

答案 0 :(得分:2)

您可以在Razor页面中使用路由模板:

filtering result

注释此行options.Conventions.AddPageRoute,然后在您的search_details页面中添加可为空的参数:

@page "{id?}"

在cs文件中,您可以获得像这样的路线数据:

public void OnGet(string id)
{

}

对于第二个要求,您可以添加如下模板:

options.Conventions.AddPageRoute("/search_details", "{id}");

这样localhost:8080/1002将重定向到search_details页,您还将获得id作为路由数据。