2016-06-27 3 views
0

Я имею два частичный вид которых визуализируются на странице,Частичный вид Разрешение в действии Фильтр

@{Html.RenderAction("SalesDashboard", "Dashboard");} 
    @{Html.RenderAction("MarketDashboard", "Dashboard");} 

Тогда в мой контроллер

[ChildActionOnly] 
     public PartialViewResult SalesDashboard() 
     { 
      return PartialView("_SalesDashboard"); 
     } 

     [ChildActionOnly] 
     public PartialViewResult MarketDashboard() 
     { 
      return PartialView("_MarketDashboard"); 
     } 

Это прекрасно работает. Теперь я хочу проверить, имеет ли пользователь разрешение на просмотр этого частичного представления. Поэтому я хочу проверить свой ActionFilter OnActionExecuting.

public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
if (filterContext.IsChildAction) //How to get the partial view request here, I mean the controller name and action method 
        { 
         //business logic 
        } 
        int reqCnt = SessionMenu.Menus.FindIndex(i=> i.AccessPath == filterContext.HttpContext.Request.Url.PathAndQuery); 
        if (reqCnt <= 0) 
        { 
         //business logic 
        } 
    } 

Я хочу, чтобы в моем фильтре был выбран путь частичного просмотра. Любая помощь приветствуется. Заранее спасибо

Пожалуйста, проверьте обновленный фильтр действий,

if (filterContext.IsChildAction) 
        { 
         string cName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; 
         string aMthod = filterContext.ActionDescriptor.ActionName; 
         int i = SessionMenu.Menus.FindIndex(item => item.AccessPath == "/"+ cName +"/"+aMthod); 
         if (i <= 0) 
         { 
          filterContext.Result = null; 
         } 
        } 

filterContext.Result равен нулем, если пользователь не имеет разрешения для частичного запроса, но частичный вид еще нагрузки. Что я должен проверить в своем контроллере/представлении, чтобы скрыть/предотвратить загрузку частичного представления?

ответ

1

Вы можете найти имя частичного действия в

filterContext.ActionDescriptor.ActionName 

и частичное имя контроллера в

filterContext.ActionDescriptor.ControllerDescriptor.ControllerName 

и «основной вид» ДАННЫЕ можно найти в filterContext.HttpContext.Request.RequestContext.RouteDate, например

EDIT

Затем, чтобы пропустить выполнение, вы можете сделать

filterContext.Result = new EmptyResult(); 
return; 

вместо filterContext.Result = null;

+0

спасибо, шаг вперед теперь, если пользователь не имеет прав для просмотра _MarketDashboard, как следует Я делаю это? –

+0

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

+0

@JohnyBravo Я не знаю, как вы управляете своим разрешением, но вы также можете сделать это в вас PartialViewResult, нет? И вернуть null, если пользователь не разрешен. Вы также можете попробовать 'return;' в 'OnActionExecuting', если пользователь не разрешен. –

0

Если вы хотите, чтобы контроллер и имя действия в фильтре вы можете сделать это:

string actionName = filterContext.ActionDescriptor.ActionName; 
string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName 
0

ChildActions вызывается в рамках действия. вы также использовали Attribute ChildActionOnly, что сделало его неприменимым до тех пор, пока не будет выполнено действие, на которое будут выполняться эти дочерние элементы. Поэтому вам просто нужно защитить свое основное действие.

Если вы хотите сделать ребенку действия на основе разрешения, чем нужно обрабатывать его на виду, как это:

@if(HttpContext.Current.User.IsInRole("RoleName")) 
{ 
    @Html.RenderAction("SalesDashboard", "Dashboard") 
    @{Html.RenderAction("MarketDashboard", "Dashboard");} 
} 

@if(HttpContext.Current.User.IsInRole("RoleName")) 
{ 
    @Html.RenderAction("MarketDashboard", "Dashboard"); 
} 
+0

. Безопасность не основана на роли, она для пользователя и тоже на основе URL-адреса, к которому он пытается получить доступ. Если мне нужно поместить эту логику в представление, то это будет много, я имею в виду, что мне нужно проверить имя контроллера, метод действия внутри представления. У меня есть все ссылки, к которым пользователь может получить доступ, хранящийся в сеансе. Можете ли вы руководствоваться этим? –

+0

Вы можете видеть, что я проверил разрешения пользователя для родительского представления, например int reqCnt = SessionMenu.Menus.FindIndex (i => i.AccessPath == filterContext.HttpContext.Request.Url.PathAndQuery); if (reqCnt <= 0) { // бизнес-логика filterContext.Result = new RedirectResult ("~/InvalidRequest/Display"); } –

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