2013-11-21 35 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