【问题标题】:Is NancyFx reverse routing like ASP.NET MVC supported?是否支持像 ASP.NET MVC 这样的 NancyFx 反向路由?
【发布时间】:2017-07-30 07:26:35
【问题描述】:

ASP.NET MVC 允许以非常有用的方式生成强类型 URL,例如:

<a href="@(Url.Action<AccountSettingsController>(c => c.BusinessInfo()))">Business info</a>

甚至:

<a href="@(Url.Action<SomeOtherController>(c => c.SomeActionMethod(id, paramX, paramY)))">Business info</a>

使用简单的自定义 URL 助手:

public static string Action<TController>(
    this UrlHelper urlHelper,
    Expression<Action<TController>> action,
    string fragment = null
) where TController : BaseController
{
    var routeValues = InternalExpressionHelper.GetRouteValuesFromExpression(action);
    var url = UrlHelper.GenerateUrl(
            routeName: null,
            actionName: null,
            controllerName: null,
            protocol: null,
            hostName: null,
            fragment: fragment,
            routeValues: routeValues,
            routeCollection: urlHelper.RouteCollection,
            requestContext: urlHelper.RequestContext,
            includeImplicitMvcValues: true
        );
    return url;
}

它允许在一个地方更改 URL 映射 (RouteConfig),并且任何控制器和操作重构并不意味着您需要去更新每个链接。

我喜欢 NancyFx,因为它的简单性和开箱即用的良好 IoC,但我不确定为什么 NanxyFx 不支持反向路由(根据操作名称生成 URL),所以它可以为它创建一些静态类型帮助器。

关于如何在 NancyFx 中实现它的任何想法,或者为什么如果无法实现,那么为什么?

【问题讨论】:

    标签: c# nancy


    【解决方案1】:

    过去接受的答案是正确的,但现在有了Linker

    它不执行开箱即用的表达式解析,但它基本上从属性名称-值对(如RouteValueDictionary)中提取参数,因此添加对从表达式树中提取参数的支持应该不会太难.

    【讨论】:

    • 有一些链接器使用示例来构建不带参数的 URL `var absoluteLink = linker.BuildAbsoluteUri(this.Context, "aNamedRoute", parameters: new {id = 123})` 这意味着参数在模块中设置。但是,如果我需要一个博客帖子的“模板 url”并在视图中传递每个帖子的 ID 怎么办?拥有类似 absoluteLink(someBlogPostIntParam)
    • @Zelid - 我想我误解了你的问题,因为你似乎在回答问题中的问题。 linker.BuildAbsoluteUri(this.Context, "aNamedTemplateRouteWithSomeBlogPostIntParam", new { someBlogPostIntParam = 123, postTitleSlug = this.Context.Items["linked-post-title"].ToLower().Replace(' ', '-') }) 获取名为 aNamedTemplateRouteWithSomeBlogPostIntParam 并具有类似 posts/{someBlogPostIntParam:int}/{postTitleSlug} 的模板路径的路由。现在,我认为您可能会遇到的问题是路线没有命名,并且由于某种原因您无法更改它,所以...
    • @Zelid ...您可以通过模板路径本身访问它。如果您查看Nancy.Linker 的源代码,您将看到一个私有的List&lt;RouteDescription&gt; AllRoutes 属性以及它是如何检索的(不太复杂)。默认情况下,链接器默认支持检索命名路由,但您可以轻松实现相同的通过路径检索它们。两者都可以从RouteDescription 类访问。明白了吗?
    • 问题是,对于名为aNamedTemplateRouteWithSomeBlogPostIntParam 的路由,您已经预定义了参数someBlogPostIntParam = 123。假设我想在一页中列出所有帖子的链接,我该怎么做?据我了解,调用aNamedTemplateRouteWithSomeBlogPostIntParam 将生成指向 ID 为 123 的博客文章的链接。在 ASP.NET MVC 中,我会在 razor 模板中执行 foreach 并遍历所有帖子,获取帖子的标题和 id 并将它们传递给 linkbuilder 标记。使用 Linker 似乎我无权在视图中传递参数。
    • @Zelid someBlogPostIntParam = 123 是参数分配,而不是定义。定义为posts/{someBlogPostIntParam:int}/{postTitleSlug},对该参数的唯一约束是它必须可以转换为整数
    【解决方案2】:

    路由在 Nancy 中没有命名,因此目前没有办法实现这样的功能。

    但是如果你发现自己改变了路线,那么我认为你有一个更大的问题要开始,就个人而言,这个很棒的功能(或者在你目前的情况下缺乏)让我更多地思考我正在制作我的路线,所以我现在很少,如果有的话,需要改变我的路线。

    如果我确实需要重命名路线,Find All 可以快速修复。

    【讨论】:

    • 我对自己的项目采用了完全相同的方法。对于办公室工作,我们使用 ASP.NET MVC 并请求将这个项目放到其他菜单,重命名它,将 URL 与菜单名称同步经常出现,命名路由在这种情况下很有帮助。
    • 啊,这让事情变得更难了,我只是让他们能够更改名称但保持 URL 不变。特别是如果它是一个面向公众的网站。
    猜你喜欢
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 2014-11-05
    相关资源
    最近更新 更多