猿问

带有 Action/Id 的 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)!


我究竟做错了什么?


白猪掌柜的
浏览 132回答 1
1回答

holdtom

由于参数名称不匹配,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 }    );}
随时随地看视频慕课网APP
我要回答