簡體   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