[ASP.MVC筆記]UrlHelper.Action跟RouteValueDictionary

UrlHelper.Action與RouteValueDictionary產生網址的筆記

前言

最近再用UrlHelper.Action與RouteValueDictionary產生網址
時遇到的問題,整理記錄以免遺忘

RouteValueDictionary

其實就是Dictionary 
​new Dictionary(StringComparer.OrdinalIgnoreCase);
網址不分大小寫所以key是要IgnoreCase

var routeValue = new RouteValueDictionary();
routeValue.Add("A", "<a>");
routeValue.Add("B", string.Empty);
routeValue.Add("C", null);
routeValue.Add("D", " ");
var url = Url.Action("Index", "MVC",routeValue);

url 會是 /MVC?A=%3Ca%3E&D=%20
B跟C消失了 因為沒有值
A跟D被Encode
 

調整特定參數到最後一個

因為有個參數是要帶網址
所以希望是在網址的最後一個參數
RouteValueDictionary 本身沒有順序的觀念
順序是在加入時hash-table就決定好了
所以就算你移除第一個key 在加入回去 還是會在第一個
並不會是最後一個

目前的想到的作法是

var routeValue = new RouteValueDictionary();
routeValue.Add("A", "https://dotblogs.com.tw");
routeValue.Add("B", "B");
var url1 = Url.Action("Index", "MVC",routeValue);
            
if(routeValue.ContainsKey("a")
    && routeValue.ElementAt(routeValue.Count-1).Key.ToLower() != "a")
{
    var a = routeValue.Where(x => x.Key.ToLower() == "a").Single();
    var list = routeValue.ToList<KeyValuePair<string, object>>();
    list.Remove(a);
    list.Add(a);
    routeValue = new RouteValueDictionary(
        list.ToDictionary(x => x.Key, x => x.Value));
}
          
var url2 = Url.Action("Index", "MVC", routeValue);


url1 是 /MVC?A=https%3A%2F%2Fdotblogs.com.tw&B=B
url2 是 /MVC?B=B&A=https%3A%2F%2Fdotblogs.com.tw

補充參數是網址的問題
Uri myUri = new Uri("http://www.example.com?A=https%3A%2F%2Fdotblogs.com.tw?z=z&y=y&B=B");
string param1 = HttpUtility.ParseQueryString(myUri.Query).Get("a");

param1會是https://dotblogs.com.tw?z=z
&y=y消失了,程式無法區分

結語

如果有更好的方法把參數移到最後也請留言囉

 

如果內容有誤請多鞭策謝謝