首页基于用户角色

问题描述:

视图 “子” 浏览:首页基于用户角色

项目\浏览\首页\ Index.cshtml

项目\地区\用户\查看\仪表板\ Supervisor.cshtml

项目\区\用户\查看\仪表板\ Worker.cshtml

控制器:

项目\控制器\ HomeController.cs

当索引页面加载时,我想调用HomeContoller中的一个动作来检测用户的角色并在索引页面内传递相应的视图。

Index.cshtml有这种通用设计:

<!DOCTYPE html> 
<html> 
<head> 
</head> 
<body> 

    <div class="everybodySees"> 
     <!-- some interesting stuff--> 
    </div> 
    <div id="target"> 
     <!-- some stuff based on user roles --> 
    </div> 

</body> 
</html> 

HomeController.cs

namespace MyApp.Controllers 
{ 
    public class HomeController : ControllerBase 
    { 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     public ActionResult About() 
     { 
      ViewBag.Message = "Your app description page."; 

      return View(); 
     } 

     public ActionResult Contact() 
     { 
      ViewBag.Message = "Your contact page."; 

      return View(); 
     } 

     public ActionResult UserDashboard([DataSourceRequest] DataSourceRequest request) 
     { 
      ViewResult view; 

      var emp = CommonInterfaces.Globals.UserDataSource.GetCurrentUser().GetRole(); 

      else if (emp == CommonInterfaces.Globals.Roles.Supervisor) 
      { 
       view = View("../Dashboard/Supervisor"); 
      } 
      else 
      { 
       view = View("../Dashboard/Worker"); 
      } 

      return view; 
     } 
    } 
} 

Supervisor.cshtml

@model MyApp.Users.DashboardEmployeeWorkloadInfo 

<div class="row-fluid"> 
    <div class="span12"> 
      @(Html.Kendo().Chart<MyApp.Users.DashboardUnitWorkloadInfo>().Name("TestChart") 
     .DataSource(d => d.Read(r => r.Action("TestChart", "Dashboard"))) 
     .Legend(legend => legend.Position(ChartLegendPosition.Bottom)) 
     .Series(series => 
       { 
        series.Column(model => model.EmpName).Name("Workers in my Unit"); 
       }) 
       .ValueAxis(axis => axis.Numeric() 
        .MajorUnit(1) 
        .Line(line => line.Visible(false))) 
      ) 
    </div> 
</div> 

Worker.cshtml

<article> 
    <p> 
     Area is static for now. 
    </p> 
</article> 

我使用@ {Html.RenderAction(“UserDashboard”,“家”);}试图在Index.cshtml页的#target标签内,但得到“错误执行的处理子请求“System.Web.Mvc .HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper”。”

我很新的MVC和不知道是否有更好的方法在MVC做到这一点。

+0

放入'UserDashboard'方法中设置断点,看看哪些你的方法的一部分崩溃。 – Shyju

+0

@Shyju它在'return'语句中崩溃。原来我引用了视图文件的错误路径。我仍然在寻找通过代码引用视图的方法,而不必使用硬编码路径。 – wombatatat

如果你能得到用户的当前角色到视图模型,那么你很可能做到这一点的Index.cshtml

@if(Model.Emp == CommonInterfaces.Globals.Roles.Supervisor) 
{ 
    <div id="target"> 
    <!-- some stuff based on user roles --> 
</div> 
} 
else { 
<div class="everybodySees"> 
    <!-- some interesting stuff--> 
</div> 

} 

这是假设,认为部分是排他性的,即用户将看到任何一个意见。如果这个想法是,用户应该首先看到的共同的东西,然后只细节,那么你可以做这样的事情,以及

<div class="everybodySees"> 
    <!-- some interesting stuff--> 
</div> 

@if(Model.Emp == CommonInterfaces.Globals.Roles.Supervisor) 
{ 
    <div id="target"> 
    <!-- some stuff based on user roles --> 
</div> 
} 

此外,如果你是从DIV目标传承的价值观局部视图,然后你还需要携带到主视图模型,然后通过它进一步下降

+0

我试图避免在视图中放置那么多逻辑。我希望在控制器中进行角色检查,这样我就可以将事情分割开来。我发现我的问题,但显然我错误的路径传递给控制器​​中的View()方法。我应该使用“〜/ Areas/User/View/Dashboard/Supervisor.cshtml”。我希望有一种方法可以用代码而不是字符串引用视图。我确信那里有东西 – wombatatat