【问题标题】:Share one action with two views用两个视图共享一个操作
【发布时间】:2014-10-01 12:46:43
【问题描述】:

我正在开发一个需要可供多种用户类型使用的控制面板的网站。我一直想知道是否可以使用单个操作来制作具有不同布局但它们在操作上相似的不同视图,这样我就不需要再次重写它们了?

例如,管理员和主管都可以修改员工详细信息,但管理员视图的布局与主管不同。我可以为每个视图编写不同的操作,但是这两个操作中的代码将完全相同,因为它们执行相同的操作。那么一个动作可以与多个视图共享吗?

【问题讨论】:

  • 你为什么不为管理员和主管创建一个单一的视图和操作......只是为管理员和主管加载不同的布局
  • @Exception: 你的意思是视图顶部的 if else 语句?
  • @Exception: 虽然这确实有效,但我在这个网站上由于某些原因不能这样做

标签: asp.net-mvc


【解决方案1】:

你当然可以。但是,该方法取决于您如何确定要呈现的布局以及该信息的来源。最直接的方法是确定用户的类型(角色),并根据用户的角色,您可以在同一操作方法中呈现特定视图...

public ActionResult YOUR_ACTION()
{
    //do your processing
    Role role = GetCurrentUserRole();

    if(role.Name = "Admin")
        return View("ViewForAdmins");
    else if (role.Name = "Supervisor") 
        return View("ViewForSupervisors");
    else 
        return View("EveryoneElseView");    
}

【讨论】:

  • @PierreOverFlow 相信我,这里没有魔法,很简单 MVC ;)
  • 一个问题,我使用 ActionFilter 对用户进行身份验证,并在其中获得角色,有没有办法将角色传递给在属性之后运行的操作而不使用 TempData。 (只是出于好奇而询问)
  • @PierreOverFlow 好吧,这取决于,为了避免两次检索信息,您可以覆盖在处理操作方法之前运行的ActionFilterOnActionExecuting。但是,我猜最好的办法是使用内置(或自定义)RoleProvider 并查询RoleProviders 方法(例如IsUserInRole),只要你是RoleProvider 就好了-编写并且不会导致到数据库(或服务)的往返....通常,这只是检查 cookie 值的问题
【解决方案2】:

也许您可以将员工详细信息放在部分视图中,然后从主视图中调用 RenderAction。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2014-05-05
    相关资源
    最近更新 更多