我正在使用MVC 4并且登陆页面出现问题
我有两种用户(让我们称之为FooUser
和BarUser
)
每个用户都有自己的登陆页面:
Foo/Index
和Bar/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 });
}
答案 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 }
);
}