【问题标题】:How to setup routing for my admin section in ASP.NET MVC?如何在 ASP.NET MVC 中为我的管理部分设置路由?
【发布时间】:2010-11-26 22:06:16
【问题描述】:

通常我的 URL 看起来像标准的:www.example.com/controller/action

现在我想设置我的管理部分,例如:

www.example.com/admin/ www.example.com/admin/user/list www.example.com/admin/content/add 等等。

所以格式是:www.example.com/admin/controller/action

我似乎无法弄清楚如何设置路线,所以它看起来像上面那样。

【问题讨论】:

    标签: c# asp.net asp.net-mvc routes


    【解决方案1】:

    您只需要在路由定义的开头使用硬编码的“管理”部分映射一个新路径。

    例如,将其添加到 Global.asax.cs 文件中的 RegisterRoutes 中的路由,并确保它出现在默认路由上方(假设您尚未添加其他路由):

    routes.MapRoute(
        "Default",                                              
        "admin/{controller}/{action}/{id}",                     
        new { controller = "Home", action = "Index", id = "" } 
    );
    

    注意:'admin' 部分硬编码在路由定义的开头。

    注意 2:如果您添加了默认路由之外的其他路由,则需要确保您的路由正确排序。

    这是来自 Scott Guthrie 的一篇关于 MVC 路由的优秀博文的链接:URL Routing

    【讨论】:

    • 使用 things 使得其他控制器通过前缀 admin/ 太容易访问了。也可以通过 yoursite/admin/Home 访问 yoursite/Home。
    【解决方案2】:

    Kelsey 的回答是正确的,但我想在讨论中添加一些内容。另一种选择是实际上根本没有“管理员”路由,而是需要经过管理员身份验证的会话才能实际访问受限制的 url。

    这通常是“传统”RESTful 应用程序的处理方式。您的控制器代表您正在操作的资源类型,动作是动词,id 是该资源特定成员的唯一标识符。

    换句话说,而不是:

    /content/list (for normal users)
    /admin/content/add (for admins)
    

    你会的

    /content/list (for everyone)
    /content/add (for admin, but must be authenticated to work)
    

    将 /admin/ 添加到 URL 并没有真正增加任何好处(除了你可以只使用一条规则编写安全逻辑来针对 /admin 下的任何内容),但权衡是更复杂的路由和打破标准 RESTful .打破标准实践本身并不是一件坏事,但你应该认为它们是标准的,除非你有打破它们的特定好处,否则你可能会考虑遵守它们。

    需要注意的是,在这两种 URL 样式中,您都需要对用户进行身份验证,否则任何人都可以使用它。

    在 ASP.NET MVC 中,您可以使用 ActionFilters 根据用户级别限制对操作(甚至整个控制器)的访问。通过使用这些过滤器装饰您的仅限管理员操作,您可以确保只有经过身份验证的管理员用户才能实际使用它们。

    阅读Scott Gu's 博客条目或Rob Connery's post 了解更多信息。

    【讨论】:

    • 您将如何处理用户的列表操作(他们无权查看所有内容)和管理员的列表操作(他们可以查看所有内容)?我不希望有一个操作列表 listAdmin 或一些愚蠢的东西。还是我走错了路。
    • @MrRogers - 这真的取决于两者的不同之处。如果唯一的区别是显示哪些数据和显示多少数据,您通常会保留相同的视图,但让控制器指定要显示的数据。如果两个视图实际上略有不同(例如管理员有编辑/删除按钮),您可以使用条件语句在视图模板中检查管理员状态。您可以在 ViewData 或 Session 中设置管理员状态。最后一个选择是将它们拉成部分。所以,你只有 1 个视图,list.aspx,但是管理员和普通用户都是部分的。
    【解决方案3】:

    从 MVC 版本 2 开始,他们添加了“区域”概念,允许您正确执行此操作:) 这里是 ScottGu's post about MVC 2 Preview

    【讨论】:

    • 区域是 MVC2 中的一个很好的特性,但是在这个特定的用例中,您仍然将相同的资源分解为不同的控制器。因此,现在不是将所有“内容”逻辑放在一个控制器中,而是将其分解。在这种情况下,您更有可能违反 DRY 规则。更不用说语义上的不和谐了。
    • 这一切都取决于管理界面在做什么。如果它是用于管理系统的后端,那么这与您的内容完全不同。如果只是添加功能,那么是的,您建议仅通过身份验证来限制它可能会更好。但我怀疑管理界面仅此而已。
    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多