2014-10-29 12 views
6

Ok. Tak więc mam problem, w którym muszę wykonać pewne kontrole autoryzacji wewnątrz działania kontrolera.Przekierowanie ASP.Net MVC z częściowego widoku z kontrolera do pełnego widoku z innego kontrolera

Są role autoryzacji, ale może istnieć, że ktoś ma TypeOnePayment, ale nie TypeTwo

[Authorize(Roles = "TypeOnePayment;TypeTwoPayment")] 
public ActionResult EnterRevenue(PaymentType payment) 
{ 
    payment = "TypeOne"; // This exists for show only. 
    var permission = string.Concat(payment,"Permission"); 
    if (!SecurityUtility.HasPermission(permission)) 
    { 
     return View("Unauthorized", "Error"); 
    } 
    return this.PartialView("_EnterRevenue"); 
} 

ale ponieważ to jest zwrócenie częściowy widok na ekran „Error” pojawia się tylko w częściowym części widzenia Strona. Czy istnieje sposób przekierowania na zupełnie nową stronę?

EDYCJA: EnterRevenue jest pobierany przez wywołanie ajax. Tak więc po prostu zwracany jest HTML i jest on umieszczany w widoku, z którego został wywołany.

+0

gdzie używacie tego częściowy widok? w ajax lub Html.Action? –

+0

Jest pobierany za pomocą wywołania ajax, a nowy html jest wstawiany do html po pomyślnym zakończeniu połączenia. – ELepolt

+0

powinieneś przeczytać: http://stackoverflow.com/questions/199099/how-to-manage-a-redirect-request-after-a-jquery-ajax-call –

Odpowiedz

5

można przekierować do innego działania:

public ActionResult EnterRevenue 
{ 
    if (!SecurityUtility.HasPermission(permission)) 
    { 
     return View("Unauthorized", "Error"); 
    } 
    return RedirectToAction("NotAuthorized","Error"); 
} 

Załóżmy mamy ErrorController z działaniem NotAuthorized która zwraca normalnego widoku, który wyświetla nie masz uprawnień, aby zobaczyć tę stronę.

Jeśli potrzebujesz tego sprawdzenia przy każdej akcji, musisz zaimplementować niestandardowy atrybut filtru akcji, w którym będziesz musiał sprawdzić, czy jest to normalne przekierowanie żądania, czy nie zwrócisz jako json i przekierowanie ze strony klienta. Zobacz asp.net mvc check if user is authorized before accessing page

Oto fragment kodu:

public class AuthorizationAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      string actionName = filterContext.ActionDescriptor.ActionName; 
      string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; 


      if (filterContext != null) 
      { 
       HttpSessionStateBase objHttpSessionStateBase = filterContext.HttpContext.Session; 
       var userSession = objHttpSessionStateBase["userId"]; 
       if (((userSession == null) && (!objHttpSessionStateBase.IsNewSession)) || (objHttpSessionStateBase.IsNewSession)) 
       { 
        objHttpSessionStateBase.RemoveAll(); 
        objHttpSessionStateBase.Clear(); 
        objHttpSessionStateBase.Abandon(); 
        if (filterContext.HttpContext.Request.IsAjaxRequest()) 
        { 
         filterContext.HttpContext.Response.StatusCode = 403; 
         filterContext.Result = new JsonResult { Data = "LogOut" }; 
        } 
        else 
        { 
         filterContext.Result = new RedirectResult("~/Home/Index"); 
        } 

       } 


       else 
       { 

        if (!CheckAccessRight(actionName, controllerName)) 
        { 
         string redirectUrl = string.Format("?returnUrl={0}", filterContext.HttpContext.Request.Url.PathAndQuery); 

         filterContext.HttpContext.Response.Redirect(FormsAuthentication.LoginUrl + redirectUrl, true); 
        } 
        else 
        { 
         base.OnActionExecuting(filterContext); 
        } 
       } 


      } 

     } 
} 

i używać go na działanie tak:

[Authorization] 
public ActionResult EnterRevenue 
{ 
    return this.PartialView("_EnterRevenue"); 
} 
+0

Mogłem źle to sformułować. Ale EnterRevenue jest częściowym widokiem. Bez względu na to, co zostanie zwrócone, pojawia się tylko w częściowym widoku na głównym widoku, z którego jest wywoływany. – ELepolt

+0

Jak się nazywa akcja EventRevenue? pokazać ten fragment kodu? –

+0

Edytowałem mój post, ale EnterRevenue jest pobierany przez wywołanie ajax. Tak więc po prostu zwracany jest HTML i jest on umieszczany w widoku, z którego został wywołany. – ELepolt

0

myślę co trzeba można sprowadzić do sposobu dla AJAX zadzwoń, aby zachowywać się inaczej w zależności od tego, do czego wracasz. Najlepsze, co udało mi się znaleźć, można podsumować w następujący sposób:

  • Po wykryciu, że nie masz pozwolenia, dodaj model stanu błędu do modelu.
  • Zastąpić OnActionExecuted (Mam nadzieję, że wszystkie kontrolery dziedziczą po podstawowym, więc możesz to zrobić w jednym miejscu, jeśli nie, dobrym pomysłem może być teraz wdrożenie). W override sprawdź, czy żądanie to ajax i stan modelu jest nieprawidłowy (jeśli chcesz, możesz sprawdzić konkretny błąd dodany w metodzie akcji), zmień status żądania na status 4xx.
  • W wywołaniu OnFailure twojego ajax, możesz przekierować do strony błędu używając kodu javascript.
0

Lub po prostu użyj standardowego przekierowania. To powinno działać wszędzie (tylko nie rób tego wewnątrz using oświadczenia czy będzie to wyjątek w tle):

Response.Redirect("/Account/Login?reason=NotAuthorised", true);       
Powiązane problemy