Перезаписать значения RouteValues ​​из данных asp-all-route-data в AnchorTagHelper - PullRequest
0 голосов
/ 13 июня 2019

При использовании TagHelpers с MVC Core (2.1) можно определить asp-all-route-data и дополнительный asp-route-x. Но если x уже содержится внутри объекта, переданного всем данным маршрута, генерируется исключение:

An element with the key 'x' already exists in the RouteValueDictionary

Можно ли изменить это поведение (расширить TagHelper, пользовательский TagHelper и т. Д.), Чтобы просто обновить значение в этом случае вместо попытки создания новой записи.

Итак, это:

if(RouteValueDictionary.HasKey(x)) 
   RouteValueDictionary[x] = value;

вместо (вероятно, что-то вроде) этого:

RouteValueDictionary.Add(x, value);

(В основном, если в моем коде нет необходимости даже в таком назначении)

Редактировать (возможно, для объяснения варианта использования): существует объект со всеми параметрами запроса для формы, но есть также ссылки, которые должны в основном отправлять те же данные и изменять значение. Отправка формы будет работать только при использовании javascript с кликом для каждой ссылки, настройке скрытого ввода и отправке формы. Но я бы предпочел не использовать JS для этого, так как такие функции, как «средний щелчок по новой вкладке», будут потеряны.

1 Ответ

0 голосов
/ 13 июня 2019

Ответ от Tseng очень полезен, однако, если необходимо использовать объект для значений, а не контекст, он может работать не так хорошо.

В конце мы создали TagHelper, который создает толькопараметры запроса:

[HtmlTargetElement("a", Attributes = RouteValuesDictionaryName)]
[HtmlTargetElement("a", Attributes = RouteValuesPrefix + "*")]
public class SearchLinkTagHelper : TagHelper
{
    private const string RouteValuesDictionaryName = "my-all-route-data";
    private const string RouteValuesPrefix = "my-route-";
    private const string Href = "href";

    private IDictionary<string, string> _routeValues;

    public override int Order => 1;

    [HtmlAttributeName(RouteValuesDictionaryName, DictionaryAttributePrefix = RouteValuesPrefix)]
    public IDictionary<string, string> RouteValues
    {
        get => _routeValues ?? (_routeValues = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase));
        set => _routeValues = value;
    }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.Attributes.TryGetAttribute(Href, out var href);

        var fixedRouteValues = new Dictionary<string, string>();
        foreach (var (newKey, value) in _routeValues.Where(r=>!string.IsNullOrWhiteSpace(r.Value)))
        {
            var key = fixedRouteValues.Keys.FirstOrDefault(k => string.Equals(k, newKey, StringComparison.InvariantCultureIgnoreCase)) ?? newKey;
            fixedRouteValues[key] = value;
        }

        var query = string.Join("&", fixedRouteValues.Select(kvp => $"{kvp.Key}={kvp.Value}"));
        var hrefValue = href.Value;
        output.Attributes.Remove(href);
        href = new TagHelperAttribute(Href, hrefValue + "?" +query);
        output.Attributes.Add(href);

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...