Добавьте QueryString к href в основном теге Anp Helper.

Я пытаюсь добавить что-либо в запросе запроса к якорям в результате HTML:

Вымышленный пример:

Пользователь делает запрос (обратите внимание, что группа и песня могут быть любыми, у меня есть маршрут, обслуживающий этот запрос: template: "{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>

Добавление строки запроса фактически работает с приведенным выше кодом, но тогда "железная дева" и "беги к холмам" в результате теряются. Приведенный выше помощник по тегам возвращает следующее (обратите внимание, как помощник отображает группу и песню в запросе в href, а не группу и песню, которые я указал в атрибутах asp-route):

<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

2 ответа

Решение

Кажется, пока нет официального способа сделать это.

Если @Context.GetRouteData().Values работает, вы должны использовать вместо этого. Идея заключается в том, что GetRouteData получает информацию о текущем маршруте из промежуточного программного обеспечения маршрутизации в виде пар ключ-значение (словарь), которые также должны содержать параметры запроса.

Я не уверен, если это работает в вашем случае, и если asp-route-band & asp-route-song жестко запрограммированы или взяты из маршрута в вашем случае.

В случае, если это может не сработать, вы можете попробовать следующий метод расширения и класс:

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>) с одним дополнительным методом для удобства, так что вы можете объединить несколько .WithRoute звонки, так как Add Метод словаря имеет void тип возврата.

Вы бы назвали это из своего представления, как это

<a  asp-controller="topic"
    asp-action="topic" 
    asp-all-route-data="@Context.GetQueryParameters().WithRoute("band", "iron-maiden").WithRoute("song", "run-to-the-hills");"
>
    Iron Maiden - Run to the hills
</a>

Если у вас есть настраиваемые параметры маршрута в таблице маршрутов, подобные этим

      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())"

И после использования «asp-all-route-data» для сохранения параметров запроса ваши пользовательские параметры удаляются, просто переместите свои параметры после «asp-all-route-data», и все будет так, как вы ожидаете.

      asp-all-route-data="@Context.Request.Query.ToDictionary(d=>d.Key,d=>d.Value.ToString()) asp-route-band="iron-maiden" asp-route-song="run-to-the-hills"

Это вернет ссылку, которую вы ожидаете

      <a href="http://mydomain/iron-maiden/run-to-the-hills?Param1=111&Param2=2222">Iron Maiden - Run to the hills</a>
Другие вопросы по тегам