2011-05-06 286 views
0

我的MVC 3 web應用程序有不同的部分,需要檢查用戶是用戶還是管理員,他們都可以訪問相同的頁面,除有些頁面有控制器(按鈕和文本框),只有管理員才能看到。我這樣做,檢查通過將用戶的訪問級別到我的視圖模型,並做了檢查:自定義屬性重定向導致「子動作不允許執行重定向動作」錯誤

@if (Model.UserAccess != "Viewer") 
{ 
    [do something] 
} 

我查一下我的動作是什麼訪問登錄的用戶擁有。如果會話超時,我將它們重定向到登錄頁面。

我的行動是從一個項目頁面視圖調用,加載爲局部:

@{Html.RenderAction("CategoryList", "Home", new { categoryId = Model.CategoryId });} 

我的控制器:

public PartialViewResult CategoryList(int categoryid = 0) 
{ 
    var useraccess = GetUseraccess(); 

    [blablabla stuff done here] 

    var model = new CategoryViewModel() 
    { 
     CategoryList = categorylist 
     UserAccess = useraccess 
    }; 

    return PartialView(model); 
} 

public string GetUseraccess() 
{ 
    var useraccess = "viewer"; //default 

    var check = SessionCheck(); 
    if (check == "expired") 
    { 
     ModelState.AddModelError("", "Session expired. Please login again."); 

     Response.Redirect("/Account/LogOn"); 
    } 
    else if (check == "admin") 
    { 
     useraccess = "admin"; 
    } 

    return useraccess; 
} 

public string SessionCheck() 
{ 
    if (Session["UserAccess"] == null) 
    { 
     return "expired"; 
    } 
    else if ((string)Session["UserAccess"] == "admin") 
    { 
     return "admin"; 
    } 
    else // viewer 
    { 
     return "viewer"; 
    } 
} 

現在工作正常。不過,我一直在試圖實現一個自定義屬性控制器被解僱之前,將檢查會話的有效期:

public class CheckUserAccessSessionAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var useraccess = filterContext.HttpContext.Session["UserAccess"]; 
     if ((string)useraccess == null) 
     { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Account", action = "LogOn" })); 
     } 
    } 
} 

[CheckUserAccessSession] 
public PartialViewResult CategoryList(int categoryid = 0) 
{ 
    [same stuff as above here] 
} 

我得到的錯誤

Exception Details: System.InvalidOperationException: Child actions are not allowed to perform redirect actions.

我明白了爲什麼錯誤發生。但我還沒有找到如何去解決它。同樣,我想發送一些來自另一個自定義屬性的數據給我的操作,但由於RedirectToRouteResult,這也不起作用。

回答

2

您的問題在這裏,您是否正在返回該操作方法上的PartialViewResult,並且根據定義,該操作方法的輸出將只是IIS提供的完整請求的一部分。您應該對操作方法進行權限檢查,該方法可用於包含部分視圖的完整視圖。

從技術上講,當您在初始實現中調用Response.Redirect時,您已經遠離了ASP.NET MVC設計約定;即使它有效,但它的設計很糟糕。

+0

我想過,但主要很少重新加載。然而,裏面的部分經常使用。所以我這樣做,以便如果用戶超時並返回,則必須對部分進行檢查,因爲主視圖不會再被觸發?我還能怎麼做?我希望將Response.Redirect更改爲RedirectToRouteResult,但這與兒童操作無法重定向的問題相同。 – LanFeusT 2011-05-06 01:00:41

+0

局域網,在這種情況下,我會做的是返回一個不同的局部視圖,指示用戶登錄(您可以在返回時按名稱指定視圖);無需重新設計您的應用程序,這是您可以嘗試的一件簡單的事情。 – Aaronontheweb 2011-05-06 01:11:10

+0

你的第二個答案是我支持的那個:D – Aaronontheweb 2011-05-06 01:11:29

0

使用這段代碼。它會工作。

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
     { 
      PartialViewResult result = new PartialViewResult(); 
      result.ViewName = "noaccess"; 


      filterContext.Result = result; 
     } 
相關問題