UrlHelper.Action與RouteValueDictionary產生網址的筆記
前言
最近再用UrlHelper.Action與RouteValueDictionary產生網址
時遇到的問題,整理記錄以免遺忘
RouteValueDictionary
其實就是Dictionary
new Dictionary
網址不分大小寫所以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消失了,程式無法區分
結語
如果有更好的方法把參數移到最後也請留言囉
如果內容有誤請多鞭策謝謝