我有一个使用web 2的api,我试图在一个区域内创建帮助文档,以便传入的请求(如. api /People.Help)将路由到people控制器,并让用户查看并提供html。在重构代码之后,我正在为该区域的路由映射而奋斗。以前,我有这样的路线:
public override void RegisterArea(AreaRegistrationContext context) {
context.MapRoute(
name: "Help",
url: "{action}.help",
defaults: new { area = "help", controller = "default" }
);所有方法都在默认控制器中,这是可行的。现在,我需要一个单独的控制器为每一个资源(如人员,时间表等),但无法使路线工作。我很感谢你的帮助,我对此非常陌生。如何使每个帮助请求映射到具有相同操作名称的控制器?
发布于 2014-07-27 16:40:03
难道不是简单的类似于:
public override RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
name: "Help",
url: "api/{controller}.help",
defaults: new { area = "help" }
);
}在您的帖子中有一个默认的控制器名称,在这种情况下,它的名称将永远是default。相反,您要寻找的是,当有人路由到以.help为后缀的控制器名称时,它将路由到类似于api/help/people的路径,最终将调用默认操作(在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。
https://stackoverflow.com/questions/24982320
复制相似问题