我有两个控制器,一个叫做Dashboard,另一个叫做DashboardCash。现在我的应用程序可以由两种类型的用户访问,一种只能访问仪表板(类型A用户),而其他用户只能访问DashboardCash(类型B用户)。为了确保我已经放置了登录页面。
我想要做的是当A类用户成功登录时,我想向他们显示没有控制器名称的网址,例如http://example.com
,而不是显示控制器名称,例如http://www.example.com/Dashboard
。对于B类用户,我想向他们展示相同的http://www.example.com
,但在这里我将替换DashboardCash。
目前我在Global.asax文件中定义了这个映射代码:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Dashboard", action = "Index", id = UrlParameter.Optional
}, // Parameter defaults
new string[] { "Merit.Traveller.BMS.Controllers" });
此代码适用于Dashboard现在我想为DashboardCash做同样的事情。
答案 0 :(得分:2)
编写自定义路由约束,使路由根据用户类型进行匹配。
实施以下界面
public interface IRouteConstraint
{
bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection);
}
然后在路线中使用它,如下所示:
routes.MapRoute(name: "newRoute1",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Dashboard", action = "Index" },
constraints: new { name = new UserTypeARouteConstraint() }
);
编辑 - 根据您在下面的问题,这里有更多详情
这是你的第二条路线
routes.MapRoute(name: "newRoute2",
url: "{controller}/{action}/{id}",
defaults: new { controller = "DashboardCash", action = "Index" },
constraints: new { name = new UserTypeBRouteConstraint() }
);
这就是约束的样子
public class UserTypeARouteConstraint : IRouteConstraint
{
bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
return IsUserOfTypeA(httpContext);
}
private bool IsUserOfTypeA(HttpContextbase httpContext)
{
// custom logic to figure out the user group
}
}
答案 1 :(得分:0)
谢谢Yishai,
解决了这个问题,我只添加了一个EliminateController作为约束的东西,只有当我们没有仪表板页面时才允许默认路由运行。
以下是详细代码:
http://jsfiddle.net/hf7wexkk/ For Code
感谢。