只需在asp.net mvc中执行一个操作,即可为不同角色渲染不同的视图

时间:2014-02-13 22:34:45

标签: asp.net asp.net-mvc

假设一个Web应用程序有三个部分或所谓的三个访问级别:

  1. 每个访问者一个(只是为了查看内容而不需要身份验证)
  2. 一个用户(授权用户)
  3. 一个用于管理员(授权管理员)
  4. 现在,管理员可以访问系统中的每个内容和每个操作,用户可以执行一些操作。我不想为用户和管理员创建单独的区域,因为我不想在每个区域重复相同的代码。例如,管理员和用户都可以创建产品,查看产品列表,创建目录......还有每个访问者也可以看到产品列表,博客帖子,...... 因此,为了分离任务而分离和复制代码并不是一个好主意。我没有创建任何区域,我想通过在他/她进入系统时定义用户角色来控制身份验证和授权(想法!?)但主要问题是当我想要单独的用户界面(视图)时对于用户和管理员。因为我只想使用一个Controller用于产品,目录,...并为它们设置身份验证和授权,我如何为管理员和用户的每个请求呈现不同的视图?我也不想通过放置一堆if / else来定义要呈现的视图(我宁愿在区域中复制代码!),任何解决方案来使我的代码变脏?

1 个答案:

答案 0 :(得分:4)

最简单的解决方案可能是编写自己的RazorViewEngine(假设您使用的是剃须刀)。

然后,当您要为用户检索视图时,可以检查用户角色并分配所需的视图。这是一个基本而粗略的例子:

public override ViewEngineResult FindPartialView(
  ControllerContext controllerContext, 
  string partialViewName, 
  bool useCache)
{
  if (controllerContext.User.IsInRole("Admin"))
  {
    var adminViewLocations = new string[] {"~/AdminViews/" }
    return new ViewEngineResult(adminViewLocations);
  }
  return base.FindPartialView(controllerContext, partialViewName, useCache);
}

这样做意味着所有用户都使用相同的控制器和身份验证,但视图会根据角色(或任何您想要的内容)而发生变化。

您可以阅读有关A Custom View Engine with Dynamic View Location的更多信息。