C# 带验证的MVC自定义路由

C# 带验证的MVC自定义路由,c#,asp.net-mvc,asp.net-mvc-4,asp.net-mvc-routing,C#,Asp.net Mvc,Asp.net Mvc 4,Asp.net Mvc Routing,大师 在我的项目中,我指定了许多不同的路线,如下所示 routes.MapRoute( name: "StudentMerit", url: "Student-Merit", defaults: new { controller = "StudentMerit", action = "GetData"}); routes.MapRoute( name: "StudentResults", url: "Student-Results", default

大师

在我的项目中,我指定了许多不同的路线,如下所示

routes.MapRoute(
   name: "StudentMerit", 
   url: "Student-Merit", 
   defaults: new { controller = "StudentMerit", action = "GetData"});

routes.MapRoute(
   name: "StudentResults", 
   url: "Student-Results", 
   defaults: new { controller = "StudentResults", action = "GetData"});
正如你们所看到的,url是用连字符分隔的,我不太担心操作名

如果我能告诉MVC,所有这些路由都可以被重写,它可以将连字符替换为空 URL,它将是我的控制器

大概

routes.MapRoute(
   name: "AllInOne", 
   url: "{Cont-roller}", 
   defaults: new { controller = {Cont-roller}.replace("-",""), action = "GetData"});
有没有办法做到这一点? 请帮忙


提前感谢。

创建您自己的RouteHandler。我不知道这是否是最好的解决方案

public class RemoveDashRouteHandler : MvcRouteHandler
{
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        requestContext.RouteData.Values["controller"] = ((string)requestContext.RouteData.Values["controller"]).Replace("-", String.Empty);

        return base.GetHttpHandler(requestContext);
    }
}
用法

编辑备选解决方案

我发现了一个更好的解决方案(在我看来),将Route分为子类,然后覆盖GetRouteData。这样更好,因为Route的职责是生成RoutedData,而MvcRouteHandler的职责是获取IHttpHandler

public class RemoveDashRoute : Route
{
    private const string ControllerKey = "controller";

    public RemoveDashRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints = null, RouteValueDictionary dataTokens = null, IRouteHandler routeHandler = null)
        : base(url, defaults, constraints ?? new RouteValueDictionary(), dataTokens ?? new RouteValueDictionary(), routeHandler ?? new MvcRouteHandler())
    {
    }
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var routeData = base.GetRouteData(httpContext);
        if (routeData != null && routeData.Values.ContainsKey(ControllerKey))
        {
            routeData.Values[ControllerKey] = ((string)routeData.Values[ControllerKey]).Replace("-", String.Empty);
        }
        return routeData;
    }
}
用法


创建自己的RouteHandler。我不知道这是否是最好的解决方案

public class RemoveDashRouteHandler : MvcRouteHandler
{
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        requestContext.RouteData.Values["controller"] = ((string)requestContext.RouteData.Values["controller"]).Replace("-", String.Empty);

        return base.GetHttpHandler(requestContext);
    }
}
用法

编辑备选解决方案

我发现了一个更好的解决方案(在我看来),将Route分为子类,然后覆盖GetRouteData。这样更好,因为Route的职责是生成RoutedData,而MvcRouteHandler的职责是获取IHttpHandler

public class RemoveDashRoute : Route
{
    private const string ControllerKey = "controller";

    public RemoveDashRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints = null, RouteValueDictionary dataTokens = null, IRouteHandler routeHandler = null)
        : base(url, defaults, constraints ?? new RouteValueDictionary(), dataTokens ?? new RouteValueDictionary(), routeHandler ?? new MvcRouteHandler())
    {
    }
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var routeData = base.GetRouteData(httpContext);
        if (routeData != null && routeData.Values.ContainsKey(ControllerKey))
        {
            routeData.Values[ControllerKey] = ((string)routeData.Values[ControllerKey]).Replace("-", String.Empty);
        }
        return routeData;
    }
}
用法


你的意思可能是
移除ashroutehandler
。是的。。第二种选择似乎更好!!你的意思可能是
移除ashroutehandler
。是的。。第二种选择似乎更好!!