区域注册帮助文档的MapRoutes

时间:2014-07-27 15:14:16

标签: c# asp.net-web-api-routing

我有一个api使用web api 2,我正在尝试在一个区域内创建帮助文档,以便像... api / people.help这样的传入请求将路由到人员控制器和人们查看并提供html 。重构代码后,我正在为该区域的路由映射而苦苦挣扎。以前,我有这样的路线:

public override void RegisterArea(AreaRegistrationContext context) {
        context.MapRoute(
            name: "Help",
            url: "{action}.help",
            defaults: new { area = "help", controller = "default" }
        );

所有方法都在默认控制器中,这很有用。现在,我需要为每个资源(例如人员,日程安排等)使用单独的控制器,但无法使路由工作。我很感激帮助,我对此很新。如何使用相同的操作名称将每个帮助请求映射到控制器?

1 个答案:

答案 0 :(得分:0)

它不会简单地类似于:

public override RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        name: "Help",
        url: "api/{controller}.help",
        defaults: new { area = "help" }
    );
}

您在帖子中的内容是控制器名称的默认值,在这种情况下,它的名称将始终为default。相反,您正在寻找的是当有人路由到您的控制器名称后缀为.help时,它将路由到类似于api/help/people的路径,这将最终调用默认操作(在MVC),例如index.cshtml或对控制器的GET请求的默认操作(对于WebAPI)。

因此,您要将默认区域设置为help,如上所示。您还需要设置应在提供的控制器上执行的默认操作。

更新:回答评论中的问题

对于MVC,您可以使用一个操作方法,其名称与控制器名称在URL中的名称相匹配:

public class PeopleController : Controller
{
    [HttpGet] // Not strictly necessary, but just want to stress this is GET
    public ActionResult People()
    {
        // Do stuff in your action method
    }
}

唯一的问题是,您的操作方法对于每个控制器都是不同的,因此对于路径注册而言是不可知的。因此,您应该只有一个默认的Help操作:

public class PeopleController : Controller
{
    [HttpGet]
    public ActionResult Help()
    {
        // Do stuff
    }
}

然后你可以有以下路线:

public override RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        name: "Help",
        url: "api/{controller}.help",
        defaults: new { area = "help", action = "Help" }
}

您可以更进一步,在自定义基本控制器类中提供Help方法:

public class MyBaseController : Controller
{
    public virtual ActionResult Help()
    {
        // Do default behavior stuff, if appropriate
    }

    // If you don't have any "default" behavior, you could make the method abstract:
    // public abstract ActionResult Help();
}

public class PeopleController : MyBaseController
{
     public override ActionResult Help()
     {
         // Do stuff.
     }
}

更新以在评论中进一步回答OP的问题

所以,现在OP正在说:“但我希望我的视图与我的控制器具有相同的名称。”好的,这应该没问题:

public class PeopleController : MyBaseController // if you're using a base class
{
    public override ActionResult Help()
    {
        return ViewResult("People");
    }
}

因此,您可以拥有任何您想要的名称的视图。但是如果视图的名称与操作方法的名称不同,那么在返回(比如说)ViewResult时,您需要指定要返回的视图的名称。

说了这么多,ASP.Net中视图的默认文件夹结构是Areas/{AreaName}/Views/{Controller}/{viewname}.{cs|vb}html。在这里,{viewname}默认情况下假定为操作方法名称,但不必如上所述明确告诉MVC返回哪个视图(在上面的示例中,People.cshtml

HTH。