2017-02-25 113 views
1

我需要創建標籤助手來從多選擇窗體生成URL。我記得,在舊的MVC我可以用這樣的:帶有RouteValueDictionary的ASP.NET核心路由

var i = 0; 
foreach (var attribute in PaginatorFilterItems) 
{      
    foreach (var attributeFilter in attribute.Value) 
    { 
     routeValues.Add($"{attribute.Key}[{i++}]", attributeFilter.ToString());   
    } 
    i=0; 
}  

現在,我可以在Url.Action使用它(...,...,routeValues)幫手,得到了這樣的事情:

?str=val1&str=val2

但在dotnet核心我得到一些轉義序列。我不知道爲什麼:

?str%5B0%5D=val1&str%5B1%5D=val2 

[]被轉義並且不綁定到路由。我該如何解決它。我需要正確的收集格式:

?str=val1&str=val2&str=val3 ... 

謝謝你的時間。

編輯:

現在正在工作。但是對於這個例子,我沒有使用RouteValueDictionary,而是使用了字符串列表和連接方法。

public class PaginatorPageTagHelper : TagHelper 
    { 
     public IDictionary<string, ICollection> PaginatorFilterItems { get; set; } 

     public string PaginatorController { get; set; } 
     public string PaginatorAction { get; set; } 
     public string PaginatorTitle { get; set; } 
     public int PaginatorPageNumber { get; set; } 
     public string PaginatorPageAttributeName { get; set; } 
     public string PaginatorAttributeCategory { get; set; } 

     public string PaginatorTagName { get; set; } 
     public IUrlHelper PaginatorUrlHelper { get; set; } 

     public override void Process(TagHelperContext context, TagHelperOutput output) 
     { 
      if(PaginatorUrlHelper == null) { 
       throw new NullReferenceException("UrlHelper parameter cannot be null."); 
      } 

      var attributeList = new List<string>();    
      var routeValues = new RouteValueDictionary(); 

      if (!string.IsNullOrEmpty(PaginatorAttributeCategory) && PaginatorFilterItems.ContainsKey(PaginatorAttributeCategory) && PaginatorFilterItems[PaginatorAttributeCategory].Count == 1) 
      { 
       routeValues.Add(PaginatorAttributeCategory, PaginatorFilterItems[PaginatorAttributeCategory].Cast<string>().First());          
      } 
      else 
      {     
       foreach (var attribute in PaginatorFilterItems) 
       {      
        foreach (var attributeFilter in attribute.Value) 
        { 
         attributeList.Add($"{attribute.Key}={attributeFilter.ToString()}"); 
        }      
       }    
      } 

      //can be <a> ,<link> or custom 
      output.TagName = PaginatorTagName ?? "a"; 
      output.Content.SetContent(PaginatorTitle);    
      routeValues.Add("page", string.Empty);    

      if (PaginatorPageNumber > 1) 
      { 
       routeValues["page"] = PaginatorPageNumber;     
      } 

      // create fallback for clasic filter, for example: /example?str=val1&str=val2 
      if (attributeList.Any()) 
      {     
       output.Attributes.SetAttribute("href", $"{this.GetPaginatorUrl(routeValues)}?{string.Join("&", attributeList)}"); 
       return; 
      }   

      output.Attributes.SetAttribute("href", this.GetPaginatorUrl(routeValues)); 
     } 

     private string GetPaginatorUrl(RouteValueDictionary routeValues) { 
      return PaginatorUrlHelper.Action(PaginatorAction, PaginatorController, routeValues); 
     } 
    } 
+0

也許這個問題是在標籤助手的其餘部分,因爲在編譯生成的html時避免編碼該url/query字符串。你能分享你的標籤幫手嗎? –

+0

@ DanielJ.G。完成。 –

回答

0

您可以使用標籤的助手,如:

<a asp-area="" asp-controller="" asp-action="" asp-route-property1="value1" asp-route-property2="value2">my link</a>等。

+0

謝謝你的回答,但我有自定義標籤助手,並且此代碼位於其中。從視圖中使用這是很好的。 –

1

我懷疑你的助手會返回一個MvcHtmlString,它將在視圖中呈現時被編碼。如果是這樣,只需返回一個純字符串。您需要確保手動對網址進行網址編碼,但在渲染時不會進行編碼。