具有Action / Id的ASP.net定制路由

时间:2019-06-17 15:28:04

标签: c# asp.net

在过去的几个小时中,我一直在尝试更改网站的路由,但我根本无法确定ASP.net向我要什么!

这是我的默认路由:

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{Id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, }
        );

每当我访问以下URL时,它都会成功显示Home / Index:

/
/Home
/Home/Index

但是,我有一个名为“ K”的操作,如下所示,该操作收到一个参数“ name”:

public ActionResult K(string name)

我想定义一条路由,使用该模板将我重定向到/Home/K/{name}

website.com/K/{name}

我在下面尝试了这条路线,但这行不通:

routes.MapRoute(
            "OnlyK",
            "K/{id}",
            new { controller = "Home", action = "K", id = UrlParameter.Optional }
        );

即使没有此路由配置,如果我转到website.com/Home/K/something,它也不会将“某物”识别为id(控制器参数== null)!

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

website.com/Home/K/something操作方法null中,URL name导致参数K的{​​{1}}值,因为参数名称不匹配。 br /> 此方法是通过路由ActionResult K(string name)进行服务的,其中 声明一个名称为Default的参数(通过id),而操作方法{controller}/{action}/{id}的参数为K

您可以通过name否决操作方法上的参数名称来解决此问题,以使两者都匹配。

BindAttribute

要执行从ActionResult K([Bind(Prefix ="id")] string name) website.com/K/{name}的重定向,您可以设置一个自定义website.com/Home/K/{name}来处理此重定向。

注册一个处理任何与路由IRouteHandler匹配的请求的路由,然后将其重定向到具有知名名称的路由(此处为K/{id})。
由于讨论的参数名称不匹配,我们将在路由中使用K而不是{id}

{name}

如下定义此路线routes.Add(new Route("K/{id}", new RedirectRouteHandler("K")));

K

routes.MapRoute( name: "K", url: "Home/K/{id}", defaults: new { controller = "Home", action = "K", id = UrlParameter.Optional } ); RouteHandler进行重定向。
RedirectHandler类具有HttpResponse方法,该方法可以处理路由名称和路由值,而无需自己构造网址。

RedirectToRoute

请注意,已注册路线的顺序很重要; class RedirectRouteHandler : IRouteHandler { private readonly string _routeName; public RedirectRouteHandler(string routeName) { _routeName = routeName; } public IHttpHandler GetHttpHandler(RequestContext requestContext) { return new RedirectHandler(this._routeName, requestContext.RouteData.Values); } } class RedirectHandler : IHttpHandler { private readonly string _routeName; private readonly RouteValueDictionary _routeValues; public RedirectHandler(string routeName, RouteValueDictionary routeValues) { this._routeName = routeName; this._routeValues = routeValues; } public bool IsReusable { return false; } public void ProcessRequest(HttpContext context) { context.Response.RedirectToRoute(this._routeName, this._routeValues); } } 看起来像。

RegisterRoutes