路由优化

时间:2011-09-14 10:21:20

标签: asp.net asp.net-mvc asp.net-mvc-routing

我现在正在进行路由,以便在地址栏上更方便地阅读网址。

例如,如果基本网址是: ... / Affaire / SearchAffaires?OnlyFavorite = True

我添加了以下路线:

routes.MapRoute(
    "Search Affaire Only Favorite", // Route name
    "Affaire/SearchAffaires/OnlyFavorite", // URL with parameters
    new { controller = "Affaire",
         action = "SearchAffaires",
         OnlyFavorite = true } // Parameter defaults
);

网址现在显示如下: ... / Affaire / SearchAffaires / OnlyFavorite

到目前为止,对我来说真好。

另一个例子,如果基本网址是: ... / Affaire / SearchAffaires?IdStatus = 1

使用以下状态表:

1 =打开/ 2 =关闭/ 3 =取消

我如何获得这样的网址: ... / Affaire / SearchAffaires / Open

1 个答案:

答案 0 :(得分:1)

您可以编写自定义路线:

public class SearchRoute : Route
{
    public SearchRoute()
        : base(
            "Affaire/SearchAffaires/{searchToken}",
            new RouteValueDictionary(new { controller = "Affaire", action = "SearchAffaires" }),
            new MvcRouteHandler()
        )
    { }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var rd = base.GetRouteData(httpContext);
        if (rd == null)
        {
            return null;
        }
        var searchToken = rd.Values["searchToken"] as string;
        if (string.IsNullOrEmpty(searchToken))
        {
            return rd;
        }

        if (string.Equals("OnlyFavorite", searchToken, StringComparison.OrdinalIgnoreCase))
        {
            rd.Values["onlyFavorite"] = true;
        }

        var statuses = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
        {
            { "open", "1" },
            { "close", "2" },
            { "cancelled", "3" },
        };

        string idStatus;
        if (statuses.TryGetValue(searchToken, out idStatus))
        {
            rd.Values["idStatus"] = idStatus;
        }

        return rd;
    }
}

你会这样注册:

routes.Add("Search Affaires", new SearchRoute());

以下是这将如何运作:

  • Affaire/SearchAffaires/OnlyFavorite将路由到SearchAffaires控制器的Affaire操作并传递onlyFavorite=true参数。
  • Affaire/SearchAffaires/open将路由到SearchAffaires控制器的Affaire操作并传递idStatus=1参数。 closecancelled相同。
  • 此路线将忽略任何其他网址格式