2016-04-21 5 views
0

Просмотров:Домашняя страница "подразделом" Views на основе роли пользователя

Project \ Views \

Project \ Области \ User \ Вид \ Панель управления \ Supervisor.cshtml

Project Home \ Index.cshtml \ Области \ User \ Вид \ Панель управления \ Worker.cshtml

Контроллеры:

Project \ Controller \ 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», «Home»);} в теге #target на странице Index.cshtml, но получить «Ошибка выполнения дочернего запроса для обработчика» System.Web.Mvc .HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper «.

Я довольно новичок в mvc и задаюсь вопросом, есть ли лучший способ добиться этого в MVC.

+0

Поместите контрольную точку в метод 'UserDashboard' и посмотрите, какая часть вашего метода сбой. – Shyju

+0

@Shyju Он рушился на утверждение 'return'. Оказывается, я ссылался на неправильный путь для файлов вида. Я все еще ищу способы ссылки на представления через код и не должен использовать жесткий кодированный путь. – wombatatat

ответ

0

Если вы можете получить текущую роль пользователя в виде модель, то вы вполне могли бы сделать это в 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> 
} 

Кроме того, если вы передаете вниз значение к частичному виду от цели сНа, то вам также нужно будет перенести это в основную схему просмотра, а затем передать его дальше.

+0

Я старался избегать использования такой логики в представлении. Я надеялся выполнить проверку роли в контроллере, чтобы я мог держать сегменты сегментами. Я нашел свою проблему, хотя, по-видимому, я пропустил неправильный путь к методу View() в контроллере. Я должен был использовать «~/Areas/User/View/Dashboard/Supervisor.cshtml». Я бы хотел, чтобы был способ ссылаться на представление с кодом, а не на строку. Я уверен, что есть что-то там – wombatatat

Смежные вопросы