我的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,這也不起作用。
我想過,但主要很少重新加載。然而,裏面的部分經常使用。所以我這樣做,以便如果用戶超時並返回,則必須對部分進行檢查,因爲主視圖不會再被觸發?我還能怎麼做?我希望將Response.Redirect更改爲RedirectToRouteResult,但這與兒童操作無法重定向的問題相同。 – LanFeusT 2011-05-06 01:00:41
局域網,在這種情況下,我會做的是返回一個不同的局部視圖,指示用戶登錄(您可以在返回時按名稱指定視圖);無需重新設計您的應用程序,這是您可以嘗試的一件簡單的事情。 – Aaronontheweb 2011-05-06 01:11:10
你的第二個答案是我支持的那個:D – Aaronontheweb 2011-05-06 01:11:29