【问题标题】:Is there a named routes and default params equivalent for Razor Pages page routes?Razor Pages 页面路由是否有等效的命名路由和默认参数?
【发布时间】:2020-10-23 09:35:45
【问题描述】:

我有一个带有多个 GET 参数绑定的 JobPosts/Index 页面以允许过滤:我们以 CityIdIsRemote 为例。我不希望这些作为查询字符串参数传递,而是我想为它们使用友好的路由。所以我定义了这些:

options.Conventions.AddPageRoute("/JobPosts/Index", "cities/{cityId}/jobs");
options.Conventions.AddPageRoute("/JobPosts/Index", "remote-jobs");
options.Conventions.AddPageRoute("/JobPosts/Index", "jobs");

当我在浏览器中键入它们并且CityId 绑定正确时,路由工作得很好,但是缺少两件事。

首先,无法为我的IsRemote 参数指定默认值,我想在使用remote-jobs URL 时将其设置为true ONLY

其次,在尝试生成这样的 URL 时:

<a asp-area="" asp-page="/JobPosts/Index" asp-route-cityId="@Model.CityId"></a>

我得到以下网址:

https://localhost:44391/jobs?cityId=2265885

当我真正期望的是:

https://localhost:44391/cities/2265885/jobs

所以看起来标签助手或负责构建 URL 的部分根本没有查看不同的路由来尝试根据参数列表获得最佳匹配。实际上,它将始终使用为该页面定义的最后一页路由。

我也无法在任何地方为页面路由指定路由名称,然后使用asp-route 明确说出我想要的路由。

任何想法如何实现这一目标?或者,如果这是 Razor Pages 路线图上的内容?

编辑: 硬编码href 不是一种选择。我希望这通过正确的路由服务,因为还有其他事情要做,比如为非英语用户生成特定于文化的 URL(例如{cultureId}/cities/{cityId}/jobs - 这是通过路由约定完成的。硬编码@987654335 @ 显然会绕过它。

【问题讨论】:

    标签: asp.net-core razor-pages


    【解决方案1】:

    有一种简单的方法可以设置IsRemote 默认值。

    public bool IsRemote { get; set; } = true;
    

    这个标签asp-page将直接链接到页面/JobPosts/Index.csthml

    https://localhost:44391/JobPosts?cityId=2265885
    
    = https://localhost:44391/JobPosts/Index?cityId=2265885
    

    如果您期待网址https://localhost:44391/jobs?cityId=2265885 你可以试试这个标签来请求。

    <a href="/cities/@Model.CityId/jobs">Go to JobPosts</a>
    

    —————————————————————————————————

    使用中间件处理/remote-jobs

            app.Run(next => async context =>
            {
                if (context.Request.Path == "/remote-jobs")
                {
                    return View with default IsRemote 
                }
            });
    

    【讨论】:

    • 感谢 Michelle 抽出时间来回答,不幸的是,这并没有解决我的任何问题。关于默认值 - 我不希望它对所有路由都为真,我只想为 /remote-jobs 路由定义默认值 - 这可以使用 ASP.NET 的经典路由系统。
    • 至于 URL 建议 - 这是硬编码。虽然在某些情况下你可能会侥幸逃脱,但这是我想避免的。除此之外,就我而言,这真的不是一个选择。该站点是多语言的,因此根据上下文信息,路线实际上是/cities/@Model.CityId/jobs{cultureId}/cities/@Model.CityId/jobs。路由服务的工作是做出这个决定并提出 URL,如果应用程序中的每个 URL 都有一个 if/else 并根据可用参数保留硬编码 href,这将是很疯狂的。
    • 带有{cultureId} 的部分通过路由约定可以正常工作,但是按照建议对href 进行硬编码显然会绕过路由机制,因此它不再起作用。
    • 嗨,Marius,很抱歉这个不成熟的答案,并从您的 cmets 中学到了很多东西。关于属性路由,可以查看这篇文章mikesdotnetting.com/article/339/…
    • if (context.Request.Path.Contains("/remote-jobs")) 可以修复
    猜你喜欢
    • 2018-07-07
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 2018-12-05
    • 2020-12-09
    • 2016-08-21
    相关资源
    最近更新 更多