c# - 带验证的 MVC 自定义路由

标签 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", 
   defaults: new { controller = "StudentResults", action = "GetData"});

如您所见,网址是用连字符分隔的,我不太担心操作名称

如果我可以告诉 MVC 将连字符替换为空,则所有这些路由都可以重写 URL,它将成为我的 Controller 。

类似于,

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);
    }
}

使用

routes.MapRoute(
     name: "AllInOne",
     url: "{controller}",
     defaults: new { controller = "Default", action = "GetData" }
).RouteHandler = new RemoveDashRouteHandler();

编辑替代解决方案

我通过子类化 Route 然后覆盖 GetRouteData 找到了更好的解决方案(在我看来)。更好的是,Route 的职责是生成 RouteData,而 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;
    }
}

使用

routes.Add("AllInOne", new RemoveDashRoute(
    url: "{controller}",
    defaults: new RouteValueDictionary(new { controller = "Home", action = "GetData" }))
);

关于c# - 带验证的 MVC 自定义路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19707461/

相关文章:

javascript - 如何像 C# 一样在 Javascript 中传递手动参数顺序?

ios - 在 iOS 默认 pdf 阅读器上查看时,PDF4NET pdf 不显示绑定(bind)内容

asp.net-mvc - 使用 MVC 和 jQuery 进行内联客户端验证

c# - 锁定数据库,使用 C#

c# - 尝试使用 sqlite-net 按 PrimaryKey 选择时,SQLite 没有结果

c# - 如何创建集合 (1 :n) relation

C# MySql 在 C# 中存储多个数据库行

c# - 我怎样才能在 linq asp.net mvc 5 中拥有动态的 where 条件?

asp.net-mvc-4 - 如何访问剑道网格页脚模板值

asp.net-mvc-3 - 使用 Asp.Net MVC3 或 MVC4 进行 Ninject 依赖注入(inject)