2016-02-04 217 views
0

通過路徑值的參數一致的方式如下路線訪問通過查詢字符串

routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Portal", action = "Index", id = UrlParameter.Optional } 
); 

我無法控制用戶是否有訪問該頁面「/ useraccount /編輯/ 1」或「/ useraccount /編輯?ID = 1」。當使用UrlHelper Action方法生成URL時,如果id作爲查詢字符串參數傳遞,則該值不包含在RouteData中。

new UrlHelper(helper.ViewContext.RequestContext).Action(
          action, helper.ViewContext.RouteData.Values) 

我正在尋找訪問的id值,無論是用於訪問網頁,還是有辦法自定義的RouteData對象的初始化該URL的一致的方式,以便它會檢查查詢字符串缺少路由參數並在找到它們時添加它們。

+0

它看起來像編寫自定義路線可以讓我通過覆蓋GetRouteData添加缺少的值到的RouteData ;我會在測試完成後發佈源代碼。 – Failwyn

回答

0

擴展路由結束了我的需求最簡單的方法;感謝你的建議!讓我知道是否有任何明顯的問題(除了課程名稱)與我的解決方案。

FrameworkRoute.cs

public class FrameworkRoute: Route 
{ 
    public FrameworkRoute(string url, object defaults) : 
     base(url, new RouteValueDictionary(defaults), new MvcRouteHandler()) 
    { 
    } 

    public override RouteData GetRouteData(HttpContextBase httpContext) 
    { 
     var routeData = base.GetRouteData(httpContext); 
     if (routeData != null) 
     { 
      foreach (var item in routeData.Values.Where(rv => rv.Value == UrlParameter.Optional).ToList()) 
      { 
       var val = httpContext.Request.QueryString[item.Key]; 
       if (!string.IsNullOrWhiteSpace(val)) 
       { 
        routeData.Values[item.Key] = val; 
       } 
      } 
     } 

     return routeData; 
    } 
} 

的Global.asax.cs

protected override void Application_Start() 
{ 
     // register route 
     routes.Add(new FrameworkRoute("{controller}/{action}/{id}", new { controller = "Portal", action = "Index", id = UrlParameter.Optional })); 
1

您可以使用

@Url.RouteUrl("Default", new { id = ViewContext.RouteData.Values["id"] != null ? ViewContext.RouteData.Values["id"] : Request.QueryString["id"] }) 
0

嘗試此解決方案

var qs = helper.ViewContext 
       .HttpContext.Request.QueryString 
       .ToPairs() 
       .Union(helper.ViewContext.RouteData.Values) 
       .ToDictionary(x => x.Key, x => x.Value); 

      var rvd = new RouteValueDictionary(qs); 

      return new UrlHelper(helper.ViewContext.RequestContext).Action(action, rvd); 

轉換的NameValueCollection試試這個

public static IEnumerable<KeyValuePair<string, object>> ToPairs(this NameValueCollection collection) 
     { 
      if (collection == null) 
      { 
       throw new ArgumentNullException("collection"); 
      } 

      return collection.Cast<string>().Select(key => new KeyValuePair<string, object>(key, collection[key])); 
     }