2013-11-21 33 views
1

我想在MVC 5中設置屬性路由。我有一個默認行爲,但行動根本不在我的模板中。這是我的舊路線。MVC 5屬性路由 - 默認行動不在模板中

routes.MapRoute(null, 
    "Article/{id}/{*path}", 
    new { controller = "Article", action = "Index" , id = UrlParameter.Optional, path = UrlParameter.Optional } 
); 

這將滿足/文章/ 1 /測試的路線,而無需使用所述索引中的路徑(即/文章/索引/ 1 /測試)的作用。

我也有另一種方法,將被默認的地圖路徑捕獲.... /文章/項目。

我的問題是我無法弄清楚如何在MVC 5中使用新的屬性路由進行此路由設置。下面的代碼有些作品,但我不想爲每種方法添加路由。我希望能夠在類的頂部放置一些能夠滿足所有方法的東西,並且我只是將其他東西添加到我的Index方法中。

[RoutePrefix("Article")] 
public class ArticleController: BaseController 
{ 
    [Route("{id?}/{*path?}")] 
    public ActionResult Index(int id, string path) 
    { 

    } 

    [Route("Items")] 
    public ActionResult Items() 
    { 

    } 

    [Route("TestMethod")] 
    public ActionResult TestMethod() 
    { 

    } 
} 

我希望能得到像下面這樣的東西。問題是我不得不把索引放在我的路徑前面,就像.../Index/1/test。

[RoutePrefix("Article")] 
[Route("{action=Index}")] 
public class ArticleController : BaseController 
{ 
    Route[("{id?}/{*path?}")] 
    public ActionResult Index(int id, string path) 
    { 

    } 

    public ActionResult Articles() 
    { 

    } 

    public ActionResult TestMethod() 
    { 

    } 
} 
+0

可以肯定的是,你想爲你的第一個動作寫'Article/1/test',爲第二個寫'Items/Items'呢? –

回答

2

以下是您可以實現上述場景的方法。 (你可以在代碼中找到我的評論,其中描述了可能發生的動作)。

請注意,我對'id'路由變量使用了內聯約束int。這是因爲我們想要確保像'Article/TestMethod'這樣的請求不會被路由'Article/{id?}/{* path}'捕獲。理想情況下,您希望在屬性路由上有一個Order屬性來命令它們避免上述情況,但是我們在最後一分鐘刪除了該屬性,並且沒有時間將其添加回來,因爲我們希望確保正確執行此操作就所有情況而言。 (其實你應該面對類似的問題,你的屬性前的路由更改...你可以分享你的屬性前的路由配置看起來像嗎?)

我們默認情況下命令我們把最具體的路線通用的。因此,在目前的情況下,由於一條路徑'Article/{id:int?}/{* path}'有一個約束,它將放置在通用路由'Article/{action}'之前,這就是工作原因目前。

在我們的下一個版本中,我們重新介紹Order屬性,它可以爲您提供更多的靈活性。

[RoutePrefix("Article")] 
[Route("{action}")] 
public class ArticleController : Controller 
{ 
    // GET /Article 
    // GET /Article/10 
    // GET /Article/10/abc/def 
    [Route("{id:int?}/{*path}")] 
    public ActionResult Index(int? id, string path) 
    { 
     return Content("Index:" + id + ":" + path); 
    } 

    // GET /Article/Articles 
    public ActionResult Articles() 
    { 
     return Content("Articles"); 
    } 

    // GET /Article/TestMethod 
    public ActionResult TestMethod() 
    { 
     return Content("TestMethod"); 
    } 
} 
+0

這很好,謝謝。 – midavis