C# NancyFx是否支持像ASP.NET MVC一样的反向路由?

C# NancyFx是否支持像ASP.NET MVC一样的反向路由?,c#,nancy,C#,Nancy,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

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;
}
公共静态字符串操作(
这个UrlHelper UrlHelper,
表达行动,
字符串片段=null
)其中TController:BaseController
{
var routeValues=InternalExpressionHelper.GetRouteValuesFroExpression(操作);
var url=UrlHelper.GenerateUrl(
routeName:null,
actionName:null,
控制器名称:空,
协议:空,
主机名:null,
碎片:碎片,
路由值:路由值,
routeCollection:urlHelper.routeCollection,
requestContext:urlHelper.requestContext,
IncludeImplicitMVC值:true
);
返回url;
}
它允许在一个地方(RouteConfig)更改URL映射,任何控制器和操作重新分解并不意味着您需要去更新每个链接

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


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

路由在Nancy中没有命名,因此目前无法实现此类功能

但是,如果你发现自己在改变路线,那么我想你有一个更大的问题要开始,就个人而言,这个很棒的功能(或者在你目前的案例中缺乏)让我更多地思考我在做什么,所以我现在很少,如果有,需要改变我的路线


如果我真的需要重命名一条路由,“全部查找”可以让它很快修复

南希没有命名路由,因此目前无法实现此类功能

但是,如果你发现自己在改变路线,那么我想你有一个更大的问题要开始,就个人而言,这个很棒的功能(或者在你目前的案例中缺乏)让我更多地思考我在做什么,所以我现在很少,如果有,需要改变我的路线


如果我真的需要重命名一条路由,“全部查找”可以让它很快修复

过去公认的答案是正确的,但现在有了答案


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

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


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

我对自己的项目采用了完全相同的方法。对于office作业,我们使用ASP.NET MVC和请求,例如将此项放入其他菜单,重命名它,将URL与菜单名同步,在这种情况下命名路由非常有用。啊,这使它更难,我只想让他们能够更改名称,但保持URL不变。特别是如果它是一个面向公众的网站,我对我自己的项目采取了完全相同的方法。对于office作业,我们使用ASP.NET MVC和请求,例如将此项放入其他菜单,重命名它,将URL与菜单名同步,在这种情况下命名路由非常有用。啊,这使它更难,我只想让他们能够更改名称,但保持URL不变。尤其是当它是一个面向公众的站点时。有一些链接器用于构建不带参数的URL的示例`var absoluteLink=linker.BuildAbsoluteUri(this.Context,“aNamedRoute”,parameters:new{id=123})`这意味着参数是在模块中设置的。但是,如果我需要一个博客帖子的“模板url”,并在视图中传递每个帖子的ID,该怎么办?像absoluteLink(someBlogPostIntParam)@Zelid这样的东西-我想我误解了你的问题,因为你似乎在回答问题中的问题
linker.BuildAbsoluteUri(this.Context,“anamedTemplateRouteWithomeBlogPostInParam”,new{someBlogPostInParam=123,postTitleSlug=this.Context.Items[“linked post title”].ToLower().Replace(“”,“-”)}
获取名为
anamedTemplateRouteWithomeBlogPostInParam
且具有类似
posts的模板路径的路由/{someblogpostintpram:int}/{postitleslug}
。现在,我想你可能得到的是路由没有命名,并且由于某种原因你不能更改它,所以…@Zelid…你可以通过模板路径本身访问它。如果你检查源代码,你会看到一个私有的
列出所有路由
属性以及如何检索它(不太复杂)。默认情况下,链接器支持按默认路径检索命名路由,但您可以轻松实现按路径检索命名路由的功能。两者都可以从类中访问。明白吗?问题是,对于名为
anamedtemplateroutwithsomeblogpostinparam
的路由,您已经预定义了参数
someblogpostinparam=123
。假设我想在一个页面中列出所有帖子的链接,我该怎么做?据我所知,使用SomeBlogPostIntParam调用
AnamedTemplateRoute将生成指向ID为123的博客帖子的链接。在ASP.NET MVC中,我会在razor模板中使用foreach,并迭代所有帖子,以获得帖子的标题和ID,然后将它们传递给linkbuilder标记。使用Linker,我似乎没有权限在视图中传递参数。@Zelid
SomeBlogPostInParam=123
是一个参数赋值,而不是一个定义。该定义将是
posts/{SomeBlogPostInParam:int}/{postTitleSlug}
,并且是对该参数的唯一约束