首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET MVC自定义路由类-无法获取路由数据

ASP.NET MVC自定义路由类-无法获取路由数据
EN

Stack Overflow用户
提问于 2013-04-22 18:55:02
回答 1查看 6.2K关注 0票数 3

我正在尝试实现我自己的路由类,继承自default Route。

这是我的自定义路由类的样子:

代码语言:javascript
复制
public class FriendlyRoute : Route
{
    public FriendlyRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
        : base(url, defaults, routeHandler)
    {

    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var routeData = base.GetRouteData(httpContext);

        var controllerName = routeData.Values["controller"].ToString();
        var actionName = routeData.Values["action"].ToString();

        routeData.Values["controller"] = fix(controllerName);
        routeData.Values["action"] = fix(actionName);

        return routeData;
    }

    private string fix(string name)
    {
        //Remove dashes: "my-controller" => "mycontroller"
    }
}

我正在做的是接受带有破折号的urls,并将其路由到正确的操作("my-controller/my- action“到"MyController/MyAction"),但我还有更多关于这个自定义路由的计划。

为了将我的自定义路由类付诸实践,我使用以下路由配置:

代码语言:javascript
复制
routes.Add("Default",
           new FriendlyRoute("{controller}/{action}/{id}",
                             new RouteValueDictionary(new { controller = "Public", action = "Start", id = UrlParameter.Optional }),
                             new MvcRouteHandler()));

这可以很好地工作!但是我对url的结构不满意。我希望有一些没有控制器名称的urls,只有动作名称(例如"/about","/contact")和一些有控制器名称的urls(例如"/mypage","/mypage/invoices")。我从使用默认路由类(不是我自己的自定义)开始,并解决了这个问题:

代码语言:javascript
复制
routes.Add("MyPages",
           new Route("MyPage/{action}",
                     new RouteValueDictionary(new { controller = "MyPage", action = "Summary"}),
                     new MvcRouteHandler()));

routes.Add("Public",
           new Route("{action}/{id}",
                     new RouteValueDictionary(new { controller = "Public", action = "Start", id = UrlParameter.Optional }),
                     new MvcRouteHandler()));

这也很好用,但现在不支持带破折号的urls。因此,我只需将我的自定义路由类交换到路由配置中:

代码语言:javascript
复制
routes.Add("MyPages",
           new FriendlyRoute("MyPage/{action}",
                             new RouteValueDictionary(new { controller = "MyPage", action = "Summary" }),
                             new MvcRouteHandler()));

routes.Add("Public",
           new FriendlyRoute("{action}/{id}",
                             new RouteValueDictionary(new { controller = "Public", action = "Start", id = UrlParameter.Optional }),
                             new MvcRouteHandler()));

现在,当我运行应用程序时,我尝试转到默认页面("/"),它崩溃了,因为在我的FriendlyRoute.GetRouteData()中对base.GetRouteData(httpContext)的调用返回null。

我是一个创建自定义路由类的新手,所以任何关于我做错了什么的提示都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-23 02:49:21

在添加额外的两个路由之后,当命中根url ("/")时,将根据路由定义从上到下依次处理它,直到匹配成功。因此,现在对于第一个路由"MyPage/{action}",它将调用public abstract RouteData GetRouteData(HttpContextBase httpContext);方法,该方法反过来将url与路由定义进行匹配,并检查约束。在匹配和约束检查的情况下,它返回RouteValueDictionary对象,否则返回null。因此,对于第一个路由定义,由于url不匹配,因此它必然返回null。您应该添加一个null检查作为愚弄

代码语言:javascript
复制
if (routeData != null)
{
    var controllerName = routeData.Values["controller"].ToString();
    var actionName = routeData.Values["action"].ToString();

    routeData.Values["controller"] = Fix(controllerName);
    routeData.Values["action"] = Fix(actionName);
}

相关资源:Route.cs

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16145387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档