如何在ASP.NET MVC中创建具有2个不同用户访问权限的1路由?

时间:2009-03-01 14:01:13

标签: asp.net-mvc routing

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

URL 1- www.bla.com/Admin/Schedule
URL 2- www.bla.com/Schedule
拥有Admin previlegies的用户将访问

“URL 1”,此View将显示一些Admin内容,并且用户必须为LoggedOn。

另一方面,用户NOT LoggedOn将访问“URL 2”,并且不会显示管理员的内容。

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

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

我想知道Global.asax是否有办法解决这个问题,配置路由......我不知道......

感谢!!!

3 个答案:

答案 0 :(得分:1)

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

并且,是的,创建Schedule控制器。使路由简单并处理后端的生成代码共享。

AdminController

public ActionResult Schedule( ... )
{
    Schedule sched = ... get model ...

    return View("Schedule", new SchedViewModel {
                                                 Schedule = sched,
                                                 Admin = true 
                                               } );
}

ScheduleController

public ActionResult Index( ... )
{
    Schedule sched = ... get model ...

    return View("Schedule", new SchedViewModel {
                                                 Schedule = sched,
                                                 Admin = false 
                                               } );    }

答案 1 :(得分: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;
  • 您有两个独立的控制器,操作和视图。

在所有三种情况下,如果您还想要最短/计划路线,您仍然可以将上述规则指向适当的控制器。

答案 2 :(得分:0)

听起来如果它是同一页面,你真的不需要一个不同的URL。但是,如果由于某种原因你还想使用2个不同的网址......

网址1:

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

网址2:

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

您没有明确表示您对计划控制器使用了哪些操作,因此请随意更改。