gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:03:18 25 4
gpt4 key购买 nike

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

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

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"
}
}

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

为了让我的自定义路由类生效,我使用了以下路由配置:

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

这很好用!但我对 url 结构不满意。我想要一些没有 Controller 名称的 url 只有操作名称(例如“/about”、“/contact”)和一些有 Controller 名称的 url(例如“/mypage”、“/mypage/invoices”)。我首先使用默认路由类(不是我自己的自定义路由类)并解决此问题:

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

这也可以正常工作,但现在不支持带破折号的网址。所以我只是将我的自定义路由类交换到路由配置中:

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。

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

最佳答案

添加额外的两条路由后,当根 url 被命中(“/”)时,它将根据路由定义从上到下顺序处理,直到匹配为止。所以现在对于第一个路由 "MyPage/{action}" 它将调用 public abstract RouteData GetRouteData(HttpContextBase httpContext); 方法,该方法依次将 url 与路由定义和检查约束。它在匹配和约束检查的情况下返回一个 RouteValueDictionary 对象,否则返回 null。因此,对于第一个路由定义,它必然会返回 null,因为 url 不匹配。你应该添加一个空检查作为傻瓜

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

希望这对您有所帮助。

关于asp.net-mvc - ASP.NET MVC 自定义路由类 - 无法获取路由数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16145387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com