【问题标题】:ASP.NET Core routing with RouteValueDictionary使用 RouteValueDictionary 的 ASP.NET Core 路由
【发布时间】:2017-02-25 21:07:10
【问题描述】:

我需要创建标签助手以通过多选从表单生成 url。我记得,在旧的 mvc 中我可以使用这样的东西:

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 core 中,我得到了一些转义序列。我不知道为什么:

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

[] 被转义并且没有绑定到路由。我该如何解决。我需要正确的收藏格式:

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

感谢您的宝贵时间。

编辑:

现在它正在工作。但是对于这个例子,我没有使用RouteValueDictionary,而是使用字符串列表和Join方法。

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/查询字符串进行编码。你能分享你的标签助手吗?
  • @DanielJ.G.完成。

标签: asp.net-mvc routing asp.net-core asp.net-core-mvc


【解决方案1】:

我怀疑你的助手返回了一个 MvcHtmlString,当它在视图中呈现时会被编码。如果是这样,只需返回一个纯字符串。您需要确保手动对值进行 URL 编码,但在呈现时不会对其进行编码。

【讨论】:

    【解决方案2】:

    您可以使用标签助手,例如:

    &lt;a asp-area="" asp-controller="" asp-action="" asp-route-property1="value1" asp-route-property2="value2"&gt;my link&lt;/a&gt; 等等。

    【讨论】:

    • 感谢您的回答,但我有自定义标签助手,并且此代码在其中。这很适合从视图中使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 2021-01-29
    • 2017-04-13
    相关资源
    最近更新 更多