没有控制器名称的MVC多个默认路由

时间:2015-02-24 23:08:47

标签: c# asp.net-mvc asp.net-mvc-routing

我有两个控制器,一个叫做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做同样的事情。

2 个答案:

答案 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

感谢。