2017-01-09 32 views
2

我見過this answer描述的無鑰匙(不無價值)的參數,如http://some.url?param1&param2 ASP.NET支持,並確認他們能夠觀看到Request.QueryString像:如何在ASP.NET創建無鑰匙URL參數

var values = this.Request.QueryString.GetValues(null); 
values.Any(o => o == "param1"); 

這是好的,但現在我想要生成這樣的網址。我的第一直覺是使用的Url.ActionRouteValueDictionary: routeValues參數,使用null作爲一個關鍵:

@{ 
    var dict = new RouteValueDictionary(); 
    dict.Add(null, "param1"); 
    dict.Add(null, "param2"); 
} 
<a href="@Url.Action("ActionName", dict)">Very link, amaze</a> 

但很顯然的C,因爲原因#forbids nulls as dictionary keys

我也嘗試了空字符串作爲鍵,但它導致一個查詢字符串,如:?=param1,=param2其中包含兩個我想要它的等號。

當然,我可以字符串操縱我的網址heck,並將&param1部分添加到查詢字符串,但我希望有一個簡潔的解決方案。

+0

爲什麼不使用路由? https://msdn.microsoft.com/en-us/library/cc668201.aspx – Alex

+0

@ 2316116您真的可以詳細說明如何「使用路由」來創建我描述的URL嗎? – SoonDead

+0

路由通常使用/作爲鍵和值之間的分隔符,url看起來像http:// server/url/param1/param2 - 所以如果使用?和&不是必須使用的路由。 – Alex

回答

0

因爲有這個沒有內置的輔助你爲什麼不推出自己的:

public static class UrlHelperExtensions 
{ 
    public static string MyAction(this UrlHelper urlHelper, string actionName, IList<string> parameters) 
    { 
     string url = urlHelper.Action(actionName); 
     if (parameters == null || !parameters.Any()) 
     { 
      return url; 
     } 

     return string.Format("{0}?{1}", url, string.Join("&", parameters)); 
    } 
} 

然後:

@{ 
    var parameters = new List<string>(); 
    parameters.Add("param1"); 
    parameters.Add("param2"); 
} 

@Url.MyAction("ActionName", parameters) 
+0

我推出了支持混合無鍵和鍵/值參數的軟件。 – SoonDead

1

您想添加鍵值,但不允許將值留空。

RouteValueDictionary ignores empty values

你可以添加一個值像1實例,但你失去了你的罰款和花花公子的解決方案。

@{ 
     var dict = new RouteValueDictionary(); 
     dict.Add("param1",1); 
    } 
    <a href="@Url.Action("Index", dict)">Very link, amaze</a> 

對於另一種解決方案,您將不得不編寫一些自定義代碼。

+0

你能澄清一下嗎?如果你指定了''param1''key和null或者string.Empty值,Url.Action助手將不會在生成的url中包含這個參數。或者,也許我誤解了你的意思? –

+0

我認爲它會工作,但我編輯了我的答案,因爲空值確實被忽略。 –

+1

可悲的是,包含1的佔位符值恰恰是我不想做的事情,這正是我問這個問題的原因。 – SoonDead