如何在我的ASP.NET MVC应用程序中设置此区域

时间:2012-12-12 00:40:47

标签: c# .net asp.net-mvc routing attributerouting

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

我也在使用nuget包AttributeRouting,而不是正常的MVC寄存器区域路径。

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

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

表示:

  • Area => API
  • Controller => SearchController
  • ActionMethod =>索引

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

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

我有look the docs并注意到RoutePrefix所以我试过了..

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

实际上创建了路由/api/search/index

但为什么我需要将RoutePrefix放在那里?难道它不够聪明,已经发现这是SearchController并创建3段路线吗?

1 个答案:

答案 0 :(得分: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无关。区域是逻辑单元。您可以在没有任何路由前缀的情况下公开该逻辑单元(因此它将挂起〜/)或者您可以将其暴露在“This / Is / A / Prefix”之外。

但是,如果你想要它足够聪明......我刚刚发布了v3.4,它可以让你这样做(如果你想;不必):

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

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

还有一件事

如果您想要获取路径区域网址并为控制器中的各个操作路由前缀鼠标嵌套,请执行以下操作:

[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() {}
}