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