2014-01-14 41 views
1

ASP.NET MVC允許產生像stongly鍵入URL的非常有用的方法:是否支持像ASP.NET MVC那樣的NancyFx反向路由?

<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或者爲什麼,如果這是不可能的事,爲什麼?

回答

1

路由不會在南希名爲所以目前還沒有辦法來實現這樣的功能。

但是,如果你發現自己改變路線,那麼我認爲你有一個更大的問題開始,個人這個真棒功能(或在目前的情況下缺乏)讓我更多地思考我做我的路線,所以我現在很少,如果有的話,需要改變我的路線。

如果我需要重命名的路線,查找所有使得它非常快速修復。

+0

我對自己的項目採取了完全相同的方法。對於辦公室工作,我們使用ASP.NET MVC,並要求將此項目放到其他菜單中,重命名它,使用菜單名稱同步URL的頻率非常高,並且在這種情況下命名路線有所幫助。 – Zelid

+0

啊,這使得它更難,我只是讓他們改變名稱,但保持相同的網址。特別是如果它是一個公共場所。 – Phill

3

使用是正確的接受的答案,但現在有Linker

它不會執行解析表達式的表達式,但它基本上是從屬性名稱 - 值對(如RouteValueDictionary)中抽取參數,因此添加對從表達式樹提取參數的支持不應太難。

+0

有接頭的使用建立的URL的例子不帶參數'變種absoluteLink = linker.BuildAbsoluteUri(this.Context「aNamedRoute」,參數,新的{ID = 123})'這意味着該參數的模塊中設置。但是如果我需要一個博客帖子的「模板網址」並在視圖中傳遞每個帖子的ID,該怎麼辦?有像absoluteLink(someBlogPostIntParam) – Zelid

+1

@ Zelid - 我想我誤解你的問題,因爲它似乎就像你回答問題中的問題。 'linker.BuildAbsoluteUri(this.Context 「aNamedTemplateRouteWithSomeBlogPostIntParam」,新的{someBlogPostIntParam = 123,postTitleSlug = this.Context.Items [ 「鏈接後標題」] ToLower將()更換(」」, ' - ')} )'得到一個名爲'aNamedTemplateRouteWithSomeBlogPostIntParam'的路由並且有一個模板路徑,比如'posts/{someBlogPostIntParam:int}/{postTitleSlug}'。現在,我認爲你可能會得到的是路由沒有被命名,並且由於某種原因你不能改變它,所以... – smartcaveman

+1

@ Zelid ...你可以通過模板路徑本身訪問它。如果您查看[Nancy.Linker]的源代碼(https://github.com/horsdal/Nancy.Linker/blob/master/src/Nancy.Linker/ResourceLinker.cs),您將看到一個私有的「List < RouteDescription> AllRoutes'屬性及其檢索方式(不太複雜)。默認情況下,默認情況下,鏈接器支持檢索命名路由,但您可以輕鬆實現相同的路徑來檢索它們。兩者都可以從['RouteDescription'](https://github.com/NancyFx/Nancy/blob/master/src/Nancy/Routing/RouteDescription.cs)類訪問。得到它? – smartcaveman