【问题标题】:How can I create 1 route with 2 differents user's access in ASP.NET MVC?如何在 ASP.NET MVC 中创建 1 个具有 2 个不同用户访问权限的路由?
【发布时间】:2009-03-01 14:01:12
【问题描述】:

我该怎么做:我有一个名为“Schedule”的页面,可以通过两种不同的方式访问它:

URL 1- www.bla.com/Admin/Schedule
URL 2- www.bla.com/Schedule

“URL 1”将由具有管理员权限的用户访问,此视图将显示一些管理员内容,并且用户必须登录。

另一方面,“URL 2”将由未登录的用户访问,并且不会显示管理内容。

但是,它们是同一个页面,只是根据用户的访问权限而有所不同。

我已经有了 AdminController,我打算把这个“计划”视图作为这个控制器的一部分。结果,我知道如果我输入“URL 1”它会起作用。但是,如果我输入“URL 2”?我是否必须创建一个“ScheduleController”来处理这个问题?

不知道有没有办法通过Global.asax解决这个问题,配置路由……不知道……

谢谢!!!

【问题讨论】:

    标签: asp.net-mvc routing


    【解决方案1】:

    您可以将 /Schedule 路由映射到 Global.asax.cs 中的 /Admin/Schedule 操作,如下所示:

            routes.MapRoute(
                "Schedule",
                "schedule",
                new { controller = "Admin", action = "Schedule" }
            );
    

    这将解决您想要两条不同的路线导致相同的操作/视图的直接问题。

    但是,这不会正确解决您的方案。主要问题是登录用户的身份与请求所采用的路由正交。换句话说,您不能强迫管理员用户总是点击 /Admin/Schedule 路由,他们也可以点击 /Schedule 路由并且仍然期望相同的最终结果。不仅如此,这样做会阻止您使用 Admin 控制器上的 [Authorize] 属性或强制用户登录的操作,并且必须实现自定义逻辑检查操作通过哪个路由并决定是否您想强制登录或让用户通过。

    因此,你必须做出决定:

    • 您共享控制器、操作和视图,并根据登录用户的身份和角色成员身份(如果有)确定是否在视图中显示附加信息。然后,您必须更改控制器的名称,因为 /Admin 不会反映此类具有的新角色;
    • 您只共享视图并拥有两个独立的控制器和操作 - Admin.Schedule 和 User.Schedule。您必须将视图放在 /views/shared 文件夹中,并从两个操作返回相同的视图,可能会传递不同的模型。您最终会得到两条路线 - /Admin/Schedule 和 /User/Schedule;
    • 您有两个独立的控制器、操作和视图。

    在所有三种情况下,如果您还想拥有最短的 /Schedule 路由,您仍然可以让上述规则指向适当的控制器。

    【讨论】:

      【解决方案2】:

      使视图共享并从两个控制器操作中呈现它。通过模型(或 ViewData)传递适当的数据,以便 View 在从非管理控制器操作呈现时知道不呈现管理内容。

      并且,是的,创建调度控制器。让路由变得简单,并在后端处理共享生成代码。

      管理员控制器

      public ActionResult Schedule( ... )
      {
          Schedule sched = ... get model ...
      
          return View("Schedule", new SchedViewModel {
                                                       Schedule = sched,
                                                       Admin = true 
                                                     } );
      }
      

      调度控制器

      public ActionResult Index( ... )
      {
          Schedule sched = ... get model ...
      
          return View("Schedule", new SchedViewModel {
                                                       Schedule = sched,
                                                       Admin = false 
                                                     } );    }
      

      【讨论】:

        【解决方案3】:

        如果是同一个页面,听起来您实际上并不需要不同的 URL。但是,如果由于某种原因您仍想使用 2 个不同的 URL...

        网址 1:

        routes.MapRoute("ScheduleAdmin", "Admin/Schedule",
                        new
                        {
                            controller = "AdminController",
                            action = "Schedule"
                        });
        

        网址 2:

        routes.MapRoute("Schedule", "Schedule",
                        new
                        {
                            controller = "ScheduleController",
                            action = "Index"
                        });
        

        您没有明确说明您对调度控制器使用了什么操作,因此请随意更改。

        【讨论】:

        • 我明白你所说的,但我真的需要这两个网址......有什么办法吗??
        • Chad,看你的解释,我必须创建一个 ScheduleController,对吧?我打算做的是在我的 AdminController 中创建一个名为“Schedule”的 ActionResult。而这个动作将按照我在问题中所说的方式呈现,配置 Global.asax ......我认为这是不可能的
        猜你喜欢
        • 2013-12-27
        • 2011-03-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-20
        • 2022-09-23
        • 1970-01-01
        • 2011-10-16
        • 1970-01-01
        相关资源
        最近更新 更多