C# NancyFx是否支持像ASP.NET MVC一样的反向路由?
ASP.NET MVC允许以非常有用的方式生成强类型URL,如: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
<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,我似乎没有权限在视图中传递参数。@ZelidSomeBlogPostInParam=123
是一个参数赋值,而不是一个定义。该定义将是posts/{SomeBlogPostInParam:int}/{postTitleSlug}
,并且是对该参数的唯一约束