1

我正在尝试在 MVC 5 中设置属性路由。我有一个具有默认操作的路由,但该操作根本不在我的模板中。这是我的旧路线。

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

这将满足/Articles/1/test 的路由,而不必为路径中的操作使用索引(即/Articles/Index/1/test)。

我还有另一种方法将被默认地图路线捕获..../Article/Items.

我的问题是我无法弄清楚如何使用 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() 
  {

  }
}
4

1 回答 1

2

以下是您可以实现上述场景的一种方法。(您可以在代码中找到我的评论,这些评论描述了可能触发该操作的 url)。

请注意,我int对“id​​”路由变量使用了内联约束。这是因为我们要确保像 '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");
    }
}
于 2013-11-21T18:42:30.043 回答