为了账号安全,请及时绑定邮箱和手机立即绑定

带有 Action/Id 的 ASP.net 自定义路由

带有 Action/Id 的 ASP.net 自定义路由

C#
白猪掌柜的 2023-04-16 09:52:41
在过去的几个小时里,我一直在尝试更改我网站的路由,但我就是找不到 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 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

由于参数名称不匹配,urlwebsite.com/Home/K/something会导致操作方法中的null参数值。 该方法通过 route 提供服务,该 route 声明了一个名称为(via )的参数,而 action 方法有一个名为 的参数。nameKActionResult K(string name)

Defaultid{controller}/{action}/{id}Kname


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


ActionResult K([Bind(Prefix ="id")] string name)

要从到重定向,website.com/K/{name}您website.com/Home/K/{name}可以设置一个自定义IRouteHandler来处理此重定向。


注册一个处理任何与路由匹配的请求的路由K/{id},并将这些请求重定向到具有众所周知名称的路由(此处:)K。

由于讨论的参数名称不匹配,我们将在路由中使用{id}instead of 。{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方法可以处理路由名称和路由值,而无需我们自己构建 url。


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好像。


public static void RegisterRoutes(RouteCollection routes)

{

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");


    routes.Add(new Route("K/{id}", new RedirectRouteHandler("K")));


    routes.MapRoute(

        name: "K",

        url: "Home/K/{id}",

        defaults: new { controller = "Home", action = "K", id = UrlParameter.Optional }

        );


    routes.MapRoute(

        name: "Default",

        url: "{controller}/{action}/{id}",

        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }

    );

}


查看完整回答
反对 回复 2023-04-16
  • 1 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信