繁体   English   中英

在带有多个可选参数的asp.net mvc中路由

[英]Routing in asp.net mvc with multiple optional parameters

我正在开发一个asp.net mvc 4应用程序,在这里我需要一个自定义路由,该路由将处理多个这样的参数:

routes.MapRoute(
   "Default",                                              
   "FilteredResults/Filter1-{1stParam}/Filter2-{2ndParam}/..../Filter-N{nthParam}",                           // URL with parameters
   new { controller = "Home", action = "Index", id = "" }   defaults
    );

我希望仅将参数的子集传递给路由(取决于是否选择了某些过滤器)

例如,如果我只选择了第二个过滤器,那么我想以此方式引用它:

<a href="/FilteredResults/Filter2-1000">

是否可以在单个路由中执行此操作而无需为过滤器的每个组合创建大量路由?

您可以尝试以下示例

在RouteConfig上:

routes.MapRoute("Name", "tag/{*tags}", new { controller = ..., action = ... });

在控制器上:

ActionResult MyAction(string tags) {
    foreach(string tag in tags.Split("/")) {
        ...
    }
}

您可以创建一个可处理此详细信息的自定义RouteBase实现。

public class FilteredRoute : RouteBase
{
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        RouteData result = null;
        var path = httpContext.Request.Path;
        // Path always starts with a "/", so ignore it.
        var segments = path.Substring(1).Split('/');

        if (segments.Any() && segments[0].Equals("FilteredResults", StringComparison.OrdinalIgnoreCase))
        {
            var result = new RouteData(this, new MvcRouteHandler());

            result.Values["controller"] = "Filter";
            result.Values["action"] = "ProcessFilters";

            // Add filters to route data (skip the first segment)
            var filters = segments.Skip(1).ToArray();

            foreach (var filter in filters)
            {
                string key = ParseRouteKey(filter);
                var value = ParseRouteValue(filter);

                result.Values[key] = value;
            }
        }

        // Make sure to return null if this route does not match
        return result;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        VirtualPathData result = null;

        // Process outgoing route here (to rebuild the URL from @Html.ActionLink)

        return result;
    }
}

请注意,如果以此方式进行操作,则只要URL以/FilteredResults/开头, /FilteredResults/器的顺序就无关紧要。

然后,您只需将其添加到您的路由配置中即可。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    // Add the filtered route
    routes.Add("Filtered", new FilteredRoute());

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM