与MVC 4不同的登陆页面

时间:2014-11-08 14:02:58

标签: c# .net asp.net-mvc asp.net-mvc-4 web

我正在使用MVC 4并且登陆页面出现问题 我有两种用户(让我们称之为FooUserBarUser
每个用户都有自己的登陆页面:
Foo/IndexBar/Index
用户登录后,我可以确定他是否为Foo或Bar并将其重定向到相关页面 但我仍有问题,那就是当用户打开主页面时。在这种情况下,用户不执行登录操作(因为他从上一个会话登录),因此我无法将他重定向到相关页面。
有没有办法设置条件默认值?类似的东西:
(欢迎任何其他想法)

if (IsCurrentUserFooUser()) //Have no idea how to get the current user at this point in the code
{
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Foo", action = "Index", id = UrlParameter.Optional });
}
else
{
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Bar", action = "Index", id = UrlParameter.Optional });
}

1 个答案:

答案 0 :(得分:2)

如果你真的需要一个适用于不同用户的新控制器,可能值得考虑。为什么不返回不同的视图并在控制器中执行一些逻辑。这将是我的首选路线,因为它比动态计算路线的开销更少。

路由在应用程序启动时进行映射,因此无法执行条件路由。您可以使用按请求处理的动态路由,这样您就可以执行一些逻辑来查看该路由是否匹配。

注意:return null在动态路由中的任何一点取消它并使其对该请求无效。

public class UserRoute: Route
{
    public UserRoute()
        : base("{controller}/{action}/{id}", new MvcRouteHandler())
    {
    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var rd = base.GetRouteData(httpContext);
        if (rd == null)
        {
            return null;
        }

        //You have access to HttpContext here as it's part of the request 
        //so this should be possible using whatever you need to auth the user. 
        //I.e session etc.
        if (httpContext.Current.Session["someSession"] == "something") 
        {
            rd.Values["controller"] = "Foo"; //Controller for this user
            rd.Values["action"] = "Index";
        }
        else
        {
            rd.Values["controller"] = "Bar"; //Controller for a different user.
            rd.Values["action"] = "Index";
        }

        rd.Values["id"] = rd.Values["id"]; //Pass the Id that came with the request. 

        return rd;
    }
}

然后可以这样使用:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.Add("UserRoute", new UserRoute());

    //Default route for other things
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}