每种角色类型的不同默认页面/控制器 - MVC 5

时间:2013-12-18 13:57:53

标签: c# asp.net-mvc asp.net-mvc-routing asp.net-mvc-5

所以我的Q如下(MVC 5): 我有几种类型的默认页面,我想在我的应用程序启动时启动。

1-匿名用户

2 ... 5 - 用于自动记录的其他用户角色(cookie)。

所以这很简单,“if”,我知道,但同时我使用 User.IsInRole(“RoleName”)方法,不能在 RouteConfig.cs中使用< /强>

如果只是简单添加使用语句,我会提前为问题的简单性道歉。

更新:我已成功通过以下方式完成:

if(User.UserInRole(“RoleName”)在我的默认ActionResault中返回RedirectToAction(“ActionName”)

虽然它不是一个优雅的解决方案,也没有定义大量的默认页面,但它可以完成工作。

3 个答案:

答案 0 :(得分:7)

这并不像你想象的那么简单。

在做这类事情时,你必须考虑几种情况。例如......

情景A:

  1. 匿名用户访问您的网站主页。
  2. 用户点击“登录”。
  3. 用户登录。
  4. 系统指导用户在哪里?
  5. 情景B:

    1. 匿名用户通过主页以外的某个深层链接访问您的网站。
    2. 用户点击“登录”。
    3. 用户登录。
    4. 系统指导用户在哪里?
    5. 情景C:

      1. 用户访问之前已对网站进行过身份验证但仍具有有效身份验证Cookie的主页以外的某些深层链接。
      2. 网站在哪里引导用户?
      3. 我有点匆忙,所以很难理解我在说什么。关键是,您必须考虑用户访问您网站的不同方式。通常,我将这种功能连接到注册和登录过程中。您将无法通过路由执行所需操作。

答案 1 :(得分:4)

解决此问题的一种方法是创建一个“Base”控制器,所有其他控制器都从该控制器继承。在此控制器中,您可以编写IF / CASE语句,并且可以覆盖基本控制器的Initialize,OnActionExecuting和OnResultExecuting方法,以根据您的逻辑重定向您希望用户结束的位置。

所以基本上你会创建一个像这样的基本控制器:

public class BaseController : Controller
{
   protected string RedirectPath = string.Empty;
   protected bool DoRedirect = false;

   protected override void Initialize(RequestContext requestContext)
   {
      base.Initialize(requestContext);
      // Your logic to determine whether to redirect or not goes here. Bellow is an example...
      if (requestContext.HttpContext.User.IsInRole("RoleName"))
      {
         DoRedirect = true;
         RedirectPath = Url.Action("SomeAction", "SomeController");
      }
   }

   protected override void OnActionExecuting(ActionExecutingContext filterContext)
   {
       base.OnActionExecuting(filterContext);
       if (DoRedirect)
       {
          // Option 1: TRANSFER the request to another url
          filterContext.Result = new TransferResult(RedirectPath);
          // Option 2: REDIRECT the request to another url
          filterContext.Result = new RedirectResult(RedirectPath);
       }
   }
}

然后,每个必须遵守此用户角色重定向逻辑的控制器都需要从BaseController继承:

public class HomeController : BaseController
{
    // Controller logic here...
}

答案 2 :(得分:0)