首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AreaRegistration MapRoutes获取帮助文档

AreaRegistration MapRoutes获取帮助文档
EN

Stack Overflow用户
提问于 2014-07-27 15:14:16
回答 1查看 210关注 0票数 0

我有一个使用web 2的api,我试图在一个区域内创建帮助文档,以便传入的请求(如. api /People.Help)将路由到people控制器,并让用户查看并提供html。在重构代码之后,我正在为该区域的路由映射而奋斗。以前,我有这样的路线:

代码语言:javascript
复制
public override void RegisterArea(AreaRegistrationContext context) {
        context.MapRoute(
            name: "Help",
            url: "{action}.help",
            defaults: new { area = "help", controller = "default" }
        );

所有方法都在默认控制器中,这是可行的。现在,我需要一个单独的控制器为每一个资源(如人员,时间表等),但无法使路线工作。我很感谢你的帮助,我对此非常陌生。如何使每个帮助请求映射到具有相同操作名称的控制器?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-27 16:40:03

难道不是简单的类似于:

代码语言:javascript
复制
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中的控制器名称相匹配:

代码语言:javascript
复制
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操作:

代码语言:javascript
复制
public class PeopleController : Controller
{
    [HttpGet]
    public ActionResult Help()
    {
        // Do stuff
    }
}

然后,您可以选择以下路线:

代码语言:javascript
复制
public override RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        name: "Help",
        url: "api/{controller}.help",
        defaults: new { area = "help", action = "Help" }
}

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

代码语言:javascript
复制
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说:“但是我希望我的观点和我的控制器有一个相同的名字。”好吧,这应该没问题:

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24982320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档