【问题标题】:Render different views for different roles just by one action in asp.net mvc只需在 asp.net mvc 中执行一项操作,即可为不同角色呈现不同的视图
【发布时间】:2014-03-13 02:03:35
【问题描述】:

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

  1. 每位访问者一个(仅用于查看内容,无需身份验证)
  2. 用户一个(授权给用户)
  3. 一个给管理员(授权给管理员)

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

【问题讨论】:

标签: asp.net asp.net-mvc


【解决方案1】:

可能最简单的解决方案是编写自己的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的信息。

【讨论】:

    猜你喜欢
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多