1

我正在尝试在我的 ASP.NET MVC 应用程序中设置区域路由。

我也在使用 nuget 包AttributeRouting,而不是普通的 MVC 注册区域路由。

据我了解,区域路线如下所示:/area/controller/method

我想做的是:-/api/search/index

意思是:

  • 面积 => Api
  • 控制器 => 搜索控制器
  • ActionMethod => 索引

.

[RouteArea("Api")]
public class SearchController : Controller
{
    [POST("Index")]
    public JsonResult Index(IndexInputModel indexInputModel) { .. }
}

但这并没有创建那条路线。这就是它所创建/api/index 的:search缺少控制器。

查看了文档并注意到了,RoutePrefix所以我尝试了这个..

[RouteArea("Api")]
[RoutePrefix("Search")]
public class SearchController : Controller
{
    [POST("Index")]
    public JsonResult Index(IndexInputModel indexInputModel) { .. }
}

这实际上创建了路线/api/search/index

但为什么我需要把它RoutePrefix放在那里?它不应该足够聪明,已经弄清楚这是一个SearchController并创建 3 段路线吗?

4

1 回答 1

1

您无需在任何地方放置 RoutePrefix。它只是作为重构/干燥的辅助工具。考虑:

[RouteArea("Api")]
public class SearchController : Controller 
{
    [POST("Search/Index")]
    public ActionResult Index() { }
}

如果您有许多操作,也许您希望它们都带有“搜索”前缀,所以您可以这样做:

[RouteArea("Api")]
[RoutePrefix("Search")]
public class SearchController : Controller 
{
    [POST("Index")]
    public ActionResult Index() { }

    // Other actions to prefix....
}

它不应该足够聪明吗?

不要厚脸皮,但不要。AR 从未打算为您读取所有代码并神奇地生成路线。它旨在让您的 URL 成为首要考虑因素,为此您应该看到您的 URL。并不是说这是最好的或唯一的做事方式,只是那是我一开始的意图。

它不够聪明的真正原因是“区域”的概念与 URL 无关。区域是一个逻辑单元。您可以在没有任何路由前缀的情况下公开该逻辑单元(因此它将挂起〜/),或者您可以将其公开在“This/Is/A/Prefix”之外。

但是,如果您希望它足够聪明....我刚刚发布了 v3.4,它可以让您这样做(如果您愿意;不必这样做):

namespace Krome.Web.Areas.Api
{
    [RouteArea]
    [RoutePrefix]
    public class SearchController : Controller 
    {
        [POST]
        public ActionResult Index() { }
    }
}

这将产生以下路线:~/Api/Search/Index。该区域来自控制器命名空间的最后一部分;路由前缀来自控制器名称;其余的 url 来自动作名称。

还有一件事

如果您想为控制器中的各个操作获取路由区域 url 和路由前缀 rat's nest,请执行以下操作:

[RouteArea("Api")]
[RoutePrefix("Search")]
public class SearchController : Controller 
{
    [POST("Index")]
    public ActionResult Index() { }

    [GET("Something")] // yields ~/Api/Search/Something
    [GET("NoPrefix", IgnoreRoutePrefix = true)] // yields ~/Api/NoPrefix
    [GET("NoAreaUrl", IgnoreAreaUrl = true)] // yields ~/Search/NoAreaUrl
    [GET("Absolutely-Pure", IsAbsoluteUrl = true)] // yields ~/Absolutely-Pure 
    public ActionResult Something() {}
}
于 2012-12-12T07:35:32.040 回答