2017-02-25 2 views
1

マルチ選択でフォームからURLを生成するには、タグヘルパーを作成する必要があります。私はこのようなものを使用でき、古いMVCで、覚えている:私はUrl.Actionでそれを使用することができ、今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; 
}  

を(...、...、routeValues)ヘルパーと、このような何かだ:

?str=val1&str=val2など

しかし、私はいくつかのエスケープシーケンスを取得します。理由は分かりません:

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

[]はエスケープされ、ルートにバインドされません。どうすれば修正できますか?正しいコレクション形式が必要です:

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

ありがとうございます。

EDIT:

今、それが働いています。しかし、この例では、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を返すと思われます。このMvcHtmlStringは、ビューにレンダリングされるときにエンコードされます。その場合は、代わりに単純な文字列を返します。値を手動でURLエンコードする必要がありますが、レンダリング時にはエンコードされません。

関連する問題