所以我的Q如下(MVC 5): 我有几种类型的默认页面,我想在我的应用程序启动时启动。
1-匿名用户
2 ... 5 - 用于自动记录的其他用户角色(cookie)。
所以这很简单,“if”,我知道,但同时我使用 User.IsInRole(“RoleName”)方法,不能在 RouteConfig.cs中使用< /强>
如果只是简单添加使用语句,我会提前为问题的简单性道歉。
更新:我已成功通过以下方式完成:
if(User.UserInRole(“RoleName”)在我的默认ActionResault中返回RedirectToAction(“ActionName”)。
虽然它不是一个优雅的解决方案,也没有定义大量的默认页面,但它可以完成工作。
答案 0 :(得分:7)
这并不像你想象的那么简单。
在做这类事情时,你必须考虑几种情况。例如......
情景A:
情景B:
情景C:
我有点匆忙,所以很难理解我在说什么。关键是,您必须考虑用户访问您网站的不同方式。通常,我将这种功能连接到注册和登录过程中。您将无法通过路由执行所需操作。
答案 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)