将QueryString附加到asp.net核心Anchor Helper Tag中的href

时间:2017-04-05 11:20:55

标签: asp.net asp.net-mvc asp.net-core tag-helpers asp.net-core-tag-helpers

我正在尝试在html结果中向锚点添加请求查询中的任何内容:

虚构的例子:

用户提出请求(请注意,乐队和歌曲可以是任何内容,我有一条路径可以满足此请求:模板:" {band} / {song}"):

http://mydomain/band/song?Param1=111&Param2=222

现在我希望我的锚点将查询字符串部分附加到我的锚点的href。所以我尝试了这样的事情(请注意' asp-all-route-data'):

<a asp-controller="topic" asp-action="topic" asp-route-band="iron-maiden" asp-route-song="run-to-the-hills" asp-all-route-data="@Context.Request.Query.ToDictionary(d=>d.Key,d=>d.Value.ToString())">Iron Maiden - Run to the hills</a>

查询字符串的附加实际上与上面的代码一起使用,但是&#34;铁娘子&#34;和#34;跑到山上&#34;在结果中迷失了。上面的标签助手返回以下内容(注意帮助器如何将请求中的乐队和歌曲镜像到href中,而不是我在asp路由属性中指定的乐队和歌曲):

<a href="http://mydomain/band/song?Param1=111&Param2=2222">Iron Maiden - Run to the hills</a>

我希望帮助者得到以下结果:

<a href="http://mydomain/iron-maiden/run-to-the-hills?Param1=111&Param2=2222">Iron Maiden - Run to the hills</a>

似乎当我使用 asp-all-route-data 时,我放弃了 asp-route-band asp-route-song 结果中的值。

有没有人偶然发现过这个?

由于

Hooroo

1 个答案:

答案 0 :(得分:4)

似乎没有任何官方方式可以做到这一点。

如果@Context.GetRouteData().Values有效,则应使用它。其背后的想法是,GetRouteData从路由中间件获取当前路由信息作为键值对(Dictionary),其中还应包含查询参数。

我不确定它是否适用于您的情况以及是否asp-route-band&amp; asp-route-song在您的案例中是硬编码或从路线中获取的。

如果可能不起作用,您可以尝试以下扩展方法&amp;类:

public static class QueryParamsExtensions
{
    public static QueryParameters GetQueryParameters(this HttpContext context)
    {
        var dictionary = context.Request.Query.ToDictionary(d => d.Key, d => d.Value.ToString());
        return new QueryParameters(dictionary);
    }
}

public class QueryParameters : Dictionary<string, string>
{
    public QueryParameters() : base() { }
    public QueryParameters(int capacity) : base(capacity) { }
    public QueryParameters(IDictionary<string, string> dictionary) : base(dictionary) { }

    public QueryParameters WithRoute(string routeParam, string routeValue)
    {
        Add(routeParam, routeValue);

        return this;
    }
}

它基本上从扩展方法后面抽象你的代码,并返回一个QueryParameters类型(这是一个扩展的Dictionary<string,string>),只需一个额外的方法,以方便,所以你可以链接多个{{ 1}}调用,因为.WithRoute字典方法具有Add返回类型。

您可以在此视图中调用

void