根据区域不同登录屏幕 - MVC3

时间:2013-05-13 08:21:28

标签: asp.net-mvc asp.net-mvc-3 asp.net-membership

我有一个移动布局区域。然后,我的路线中也有控制器,只使用正常的网站布局。

问题是当我使用[Authorize(Roles =“ROLENAME”)]且用户不在角色时,页面(移动网站)被重定向到普通网站登录页面,而不是移动网站。

是否可以根据用户尝试访问网站的区域在登录之间切换?

我尝试在我的区域web.config中添加以下内容,但它不起作用:

<authentication mode="Forms">
      <forms loginUrl="~/Activation/Login/Index" timeout="2880" />
</authentication>

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

当您登录时,操作被点击,检查它们是否在移动设备上,然后重定向到移动登录页面。

private static string[] mobileDevices = new string[] {"iphone","ppc",
                                                      "windows ce","blackberry",
                                                      "opera mini","mobile","palm",
                                                      "portable","opera mobi" };

public static bool IsMobileDevice(string userAgent)  
{  
    // TODO: null check
    userAgent = userAgent.ToLower();  
    return mobileDevices.Any(x => userAgent.Contains(x));
}

然后在你的行动中:

public ActionResult Index()
{
    if (MobileHelper.IsMobileDevice(Request.UserAgent))
    {
        // Send to mobile route.
         return RedirectToAction("Login", "MobileActivation");
    }

    // Otherwise do normal login
}

修改

如果您希望广泛应用于您的应用程序,您可以执行以下操作。

创建一个可以在以下任何地方应用的ActionFilter:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class RedirectToMobileArea : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var rd = filterContext.HttpContext.Request.RequestContext.RouteData;
        var currentAction = rd.GetRequiredString("action");
        var currentController = rd.GetRequiredString("controller");
        string currentArea = rd.Values["area"] as string;

        if (!currentArea.Equals("mobile", StringComparison.OrdinalIgnoreCase) && MobileHelper.IsMobileDevice(Request.UserAgent))
        {
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", currentController }, { "action", currentAction }, { "area", "mobile" } });
        }
    }
}

此过滤器将检查其移动设备(而不是移动区域),并将其发送到移动区域中的相同操作和控制器。 注意 如果您使用同名控制器,则必须使用控制器名称空间see this answer

注册路由

然后你可以将过滤器应用于每个动作,如:

[RedirectToMobileArea]
public ActionResult Index()
{
// do stuff.
}

或者,如果你想这样做,无论如何都要创建一个所有控制器都继承的BaseController并将其应用于:

[RedirectToMobileArea]
public abstract class BaseController : Controller {

}

然后继承它:

public HomeController : BaseController {

}

我没有测试任何这个,但它应该有用......