マルチ選択でフォームから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);
}
}
タグヘルパーの残りの部分で、結果のHTMLをビルドするときにurl/query文字列をエンコードしないようにするのが問題でしょう。あなたのタグヘルパーを共有できますか? –
@ DanielJ.G。完了しました。 –