【问题标题】:Razor Pages Custom Page RoutingRazor 页面自定义页面路由
【发布时间】:2023-03-24 10:19:01
【问题描述】:

这个问题之前已经被问过了,因为我是 Razor Pages 的新手,无法弄清楚我如何才能满足要求(愚蠢的一个)。所以这里是:我有一个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");
    });
}

我想将 url 返回为 ./search_details/id/1002 并在后端,这样做是为了获取查询字符串值:

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

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

localhost:8080/search_details/id/1002

localhost:8080/1002

有没有合适的方法可以做到这一点?我知道这对于其他目的来说是一种不好的做法,但目前我会接受它。

注意:除非没有替代品,否则我不愿意在客户端这样做。如果可能,最好在服务器端使用C#

【问题讨论】:

  • 与您的问题无关,已回答,但您拨打了三遍AddMvc。没有必要这样做。您可以将SetCompatibilityVersionAddRazorPagesOptions 链接到对AddMvc 的第一次调用:services.AddMvc().SetCompatibilityVersion(...).AddRazorPagesOptions(...)
  • 好的@Mike Brind。感谢您通知这一点,并将在一个声明中完成。

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


【解决方案1】:

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

https://www.learnrazorpages.com/razor-pages/routing

注释掉这一行 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 作为路由数据。

【讨论】:

猜你喜欢
  • 2018-10-18
  • 2020-05-06
  • 2020-05-25
  • 2018-12-04
  • 1970-01-01
  • 2019-05-22
  • 2021-10-02
  • 2017-05-17
  • 1970-01-01
相关资源
最近更新 更多