2016-01-29 112 views
0

我很難繞過我的頭在MVC核心自定義路由。 我得到我需要在這裏啓動MVC核心自定義路由

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name: "default", 
     template: "{controller=Home}/{action=Index}/{id?}"); 
}); 

添加的東西,但是我怎麼得到一個控制器正常工作? 我基本上需要一個數據細節視圖來拉起使用字符串,而不是一個ID。 所以「string url」而不是「int id」。

我在線閱讀了一些文章,但是我嘗試過的一切似乎都失敗了。 在此先感謝。

回答

1

你應該沒問題,通過添加一個路由約束,告訴你的代碼,該id將是一個字符串(單詞);

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name: "default", 
     template: "{controller=Home}/{action=Index}/{id}", 
     defaults: null, 
     constraints: new {Id = @"\w+" }); /* \d+ limits to only digits*/ 
}); 

參考:http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/creating-a-route-constraint-cs

Alternativley你可以使用AttributeRouting和裝飾用適當的Route()註釋你的控制器和操作方法:

[Route("api/[controller]")] 
public class HomeController : Controller 
{ 
    [Route("[action]/{name}")] 
    public string GetSomething(string name) 
    { 
     return foo; 
    } 
} 
+0

感謝您的幫助。我能夠通過使用添加了's'的約束來獲得約束字段。如果你想在上面進行編輯,請注意。這會在構建時拋出一個錯誤,儘管說MapRoute沒有接受多於2個值的重載方法。 –

+0

@GregGoodwin感謝您的提示。從我的頭頂我忘了默認屬性。修復它 – Marco

+0

使用內嵌約束,而不是http://www.hanselman.com/blog/AddingACustomInlineRouteConstraintInASPNETCore10.aspx它會更加清潔 –

0

爲MVC核心正確的解決辦法是增加一個約束如下:

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name: "default", 
     template: "{controller=Home}/{action=Index}/{id?}", 
     defaults: null, 
     constraints: new { id = @"\w+" }); /* \d+ limits to only digits*/ 
}); 

爲了防止發生編譯錯誤,您需要爲defaults(在本例中爲null)提供值,並且它應該是constraints而不是constraint。爲了防止可能出現的問題,您還應該注意用於id參數的情況。

0

但是我該如何讓控制器正常工作?

我只想強調這只是其中一種選擇。 當您想要對網址進行美化時使用路由,並管理網址中的第三個斜槓。當url可見時,這是最好的選擇,但請記住,如果您正在使用ajax,則可以直接使用querystring而不使用路由規則:controller/action?id = hello

如果您的需要是路由規則:

  1. 您可以修改默認規則以接受id參數中的字符串,並繼續使用接受'id'的方法。

  2. 添加另一個接受另一個參數的例子,例如'code'或者其他適合您的方法的參數,這些參數使用字符串研究關鍵字。一個 第二定製各種的水平,新的綁定(如默認爲所有控制器\動作,單個控制器,...)

  3. 您還可以使用C#屬性在控制器中添加自定義規則。 (優點:你有關於規則的方法,所以對於rembember有用,你可以在另一個項目中導入控制器及其所有的路由規則。CONS:在大型項目中可能很難理解如何交互全部分佈的規則在各種文件中)。

1

您使用路由約束來限制匹配特定路由的瀏覽器請求。您可以使用正則表達式來指定路由約束。